minimalWert aus einem Pandadataframe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Hallo :)
Ich bräuchte Hilfe und zwar habe einen Dataframe mit Pandas erstellt, wie eine große Tabelle mit mehreren Columns und ganz vielen Rows.
Es handelt sich um Preise und um Handys mit unterschiedlichen Erscheinungsjahren.
In diesem Dataframe sind über 4000 verschiedene Handys aufgelistet mit den jeweiligen Daten... Preis, Produzent, Erscheinungsjahr,...
Meine Aufgabe ist nun unter der Bedingung, dass das Erscheinungsjahr 2014 ist, ich den niedrigsten Preis in diesem Jahr ermitteln soll.
Wie kann ich das machen?
Ein Tipp könnte sein, dass ich die numpy.argmin Funktion verwenden könnte.
Ich habe nur keine Ahnung, wie ich vorgehen soll.

Danke schonmal im Vorraus. :)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Was hast du denn bereits versucht? Klappt das Einlesen der Daten? Wie weit bist du gekommen? Diese Aufgabe lässt sich auch nur mit pandas lösen.
Ich würde mir erst einmal ein DF erzeugen nur mit allen Handys von 2014 und dort dann mit .min() den Minimalwert heraussuchen.
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Also ich habe den gesamten Dataframe problemlos eingelesen, welcher alle Daten umfasst.
Jetzt geht es nur darum aus diesem Dataframe unterschiedliche Sachen herauszulesen.
Da ist aber leider ein ziemlicher Neuling in Python bin, fehlt mir das grundlegende KnowHow.
Wie könnte ich denn einen Dataframe mit nur Daten von dem Jahr 2014 machen.
Ich weiß nur, dass ich einzelne Attribute in Dataframes umwandeln kann, indem ich ....

df_Preise = df.Preis

beispielsweise machen könnte.

Und wie wäre denn dennoch die Lösung mit np.argmin?
Ich frage deshalb, weil explizit im Unterricht zu dieser Aufgabe erwähnt wurde.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Dann zeig doch mal deinen Code den du bisher hast un deine bisherigen Versuche und was da nicht geklappt hat oder was du nicht verstehst.

pandas hat eine sehr gute Dokumentation, da solltest du mal einen Blick rein werfen.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn du gar nicht so recht weißt, wo du anfangen sollst, dann such dir doch mal ein entsprechendes Tutorial raus. Eine grobe Einführung zum Selektieren (und das auch noch auf Deutsch) findet sich zB hier als Video: https://www.youtube.com/watch?v=iaziBEhdyRk

Auch wenn du damit vielleicht nicht direkt deine Aufgabe lösen kannst, so gibt es dir ein erstes Gefühl dafür wie Pandas funktioniert.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Habe es jetzt auch mal selbst versucht mit numpy zu machen (erstes mal mit numpy..), es ist möglich, allerdings sieht mein Weg sehr umsändlich und unleserlich aus. Gibt es jemandem dem ich das mal per PN schicken könnte und der drüber schaut und ggf. Anmerkungen gibt? Will dem User hier ja nicht seine Aufgabe vorwegnehmen.
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Ich habe erstmal den Dataframe eingelesen.

df = pd.read_csv('mobiledata.csv',sep=',')

Nach einiger Recherche habe ich es geschafft, einen Dataframe mit allen Handys von 2014 zu erstellen.
Ich hatte es die ganze Zeit mit for Schleifen und if Sätzen versucht, da war ich wohl auf dem Holzweg.

df_Year_2014=df[df.Year==2014]

Jetzt soll ich nur noch den Produzenten herausfinden, der den minimalsten Preis aus diesem Jahr hat.
Dazu hatte ich mir überlegt nochmal einen neuen Dataframe mit allen Daten zu dem Produkt mit dem niedrigsten Preis.
Dann könnte ich den Produzenten ja manuell herauslesen.

Zumindest hätte ich keine Idee, wie ich mir den Produzenten ausgeben lassen könnte.
Außer vielleicht: billigster_Produzent = df_minPreis2014['Produzenten']

Um diesen Dataframe aber überhaupt erstmal zu erstellen, habe ich das versucht:

df_minPreis2014 = df[df_Year_2014.Price == min.(df_Year_2014.Price)]

Doch da kommt nur invalid syntax raus.

Mein np.argmin habe ich jetzt mal ganz weggelassen, weil ich die noch nie hatte und ehrlich gesagt auch nicht richtig verstehe.

Vielen Dank auf jeden Fall schon mal für die Hilfe. :)
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du hast ja bereits ein neues DataFrame herausgefiltert. Auf dem Ergebnis kannst du direkt die betreffende Spalte selektieren und darauf argmin() aufrufen:

Code: Alles auswählen

index = df[df.Year==2014].Price.argmin()
Und mit dem Index holst du dir anschließend die entsprechende Zeile aus dem ursprünglichen df und kannst davon auch nur den Hersteller anzeigen...

Übrigens muss man nicht jedes kleine Zwischenergebnis an einen Namen binden, sondern kann die Ergebnisse direkt verknüpfen (wie du ja an dem Beispiel hier siehst). Erst wenn zu komplex wird, "merkt" man sich die Rückgaben.
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Achso, das heißt, du hast mein df_Year_2014 sozusagen direkt eingesetzt, ohne ihm vorher eine Variable zuzuordnen!?

Okay und dürfte ich fragen, was genau der Unterschied zur df.min() Funktion ist?

Könnte man nach deinem Vorgehen dann nicht auch:

index = df[df.Year==2014].Price.min() schreiben?

Bzw. argmin ist doch eine numpy Funktion, müsste dann da nicht noch irgendwo ein np. stehen?

Entschuldigt bitte meine dummen Fragen, ich programmiere nur zum ersten Mal und versuche es wirklich zu verstehen. ^^
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Okay, ich habe den Unterschied zwischen min() und argmin() verstanden.

Vielen Dank!!!

Das Einzige, was ich mich noch frage, wieso da kein np steht, obwohl es ja eine numpy Funktion ist.
Ist das nicht immer nötig?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Schokomuffin: `min()` liefert den niedrigsten Preis, nicht den Index in dem dieser niedrigste Preis steht. Wobei *der* niedrigste Preis in beiden Fällen nicht stimmt. Du müsstest also überlegen ob einer der niedrigsten Preise reicht, falls der niedrigste Wert mehrfach vorkommt, oder ob man dann noch was anderes machen muss.

`numpy.argmin()` ist eine Numpy-Funktion. Das hindert niemanden eine Funktion oder Methode auch `argmin()` zu nennen, und so haben unter anderem `pandas.Series`-Objekte eben auch eine `argmin()`-Methode. Bei Methoden ist nicht nur der Name wichtig, sondern auch auf was für einem Datentyp die aufgerufen wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

min() holt den kleinsten Wert, argmin() den Index mit dem kleinsten Wert. min() sagt dir also zB dass der kleinste Wert 14,50 ist. argmin() sagt, wo (Index) sich der kleinste Wert im Frame befindet. Das sind halt zwei unterschiedliche Dinge.

Ob man etwas so oder so schreiben könnte, lässt sich ganz einfach in der Python-Shell ausprobieren. In Verbindung mit Datenanalyse würde ich da eher zu Jupyter anstelle der Standard-Shell raten.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schokomuffin hat geschrieben: Mittwoch 21. Oktober 2020, 15:09 Achso, das heißt, du hast mein df_Year_2014 sozusagen direkt eingesetzt, ohne ihm vorher eine Variable zuzuordnen!?. ^^
Genau genommen hat df.year auch schon eine Rückgabe, nämlich die Spalte für das Jahr. df.year==2014 hat ebenfalls eine Rückgabe, nämlich Wahrheitswerte ob die Bedingung zutrifft. Diese repräsentieren sozusagen für jede Zeile, ob man sie haben will oder nicht. Dein Frame gibt daher nur die Daten aus, an deren Stelle True übergeben wird. Du könntest aber auch diese Wahrheitswerte (nennt sich üblicherweise Maske) nochmal zwischenspeichern, falls du sie später noch brauchst, um sie anderweitig einzusetzen. Ich weiß, das zerstört ein bisschen die Magie, aber es ist im Umgang mit Pandas schon ganz gut zu wissen, was da intern alles abläuft.

Du kannst ja mal ausprobieren, was ein print(df.year==2014) ergibt. ;)
Zuletzt geändert von snafu am Mittwoch 21. Oktober 2020, 15:43, insgesamt 1-mal geändert.
Schokomuffin
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 17:47

Okay, vielen Dank! :)
Antworten