Importieren einer Liste (.xslx oder csv) mit numpy

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
Feirefitz
User
Beiträge: 7
Registriert: Montag 21. August 2023, 12:33

Hallo,

Ich (Python-Neuling) habe eine Frage bezüglich dem importieren einer Liste (als Excel- oder csv-Datei).
Dabei handelt es sich um eine Liste mit lediglich einer Rubrik (Körpergröße).

Meine Idee war, dazu "pandas" zu verwenden (das ich mittels "import pandas as pd" aufrufe).
Dann verwende ich die Funktion „pd.read_excel“ & gebe den entsprechenden Dateipfad an und die Dateiendung .xslx am Ende.
(Entweder mit jeweils zwei \\ oder ein /).

Die Tabelle wird mir auch angezeigt, so weit ist alles okay.

Jetzt möchte ich die Werte in der Tabelle der Größe nach sortieren, mit dem Befehl „np.sort“
Mir ist aber nicht klar, wie das funktioniert, da ich der Tabelle ja zuerst einen Namen zuweisen müsste, oder?
Außerdem habe ich noch die Befehle „axis = 0“ sowie „axis = 1“, mittels derer ich mich ja (im Falle von 0 auf die x-Achse, im Falle von 1 auf die y-Achse) beziehen könnte.
Könnte mir jemand sagen, wie ich vorgehen muss, damit ich eine durchgehende Liste in der Form [173, 175, 176, 177, ….] aus der Excel-Datei erhalte (bei der die Werte untereinander stehen)?

Vielen Dank, schöne Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Feirefitz: `numpy.sort()` ist kein ”Befehl” sondern eine Funktion. ``axis=0`` ist noch weniger ein ”Befehl”, das ist bei einem Aufruf ein Argument.

Man muss Zwischenergebnisse nicht an Namen binden. `numpy.sort()` will als erstes Argument etwas Array-ähnliches als Argument haben. Grundsätzlich sind `DataFrame`-Objekte das. Allerdings 2D-Arrays. Dein Ergebnis soll laut Beitrag eine eindimensionale Liste sein. Also könntest Du mal schauen woraus sich `DataFrame`-Objekte zusammensetzen. Und dann den entsprechenden Bestandteil an die `numpy.sort()`-Funktion übergeben. Die liefert allerdings ein Array. Wenn Du eine Liste möchtest, dann wäre das einfach die `sorted()`-Funktion.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wenn du schon einen Pandas DataFrame hast, warum dann Numpy zum sortieren verwenden?
Das kann Pandas auch.
Siehe hier: https://pandas.pydata.org/pandas-docs/s ... alues.html
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17755
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du zum Schluß nur eine Liste willst, warum benutzt Du dann pandas und numpy, wo doch openpyxl und ein sorted-Aufruf reichen?

Code: Alles auswählen

data = sorted(row[0] for row in sheet.values)
Feirefitz
User
Beiträge: 7
Registriert: Montag 21. August 2023, 12:33

Vielen Dank für die Antworten.

Ich denke, ich werde Pandas mal weglassen.
Die Idee mit openpyxl und dem sorted-Aufruf finde ich eigentlich sehr elegant.

Konkret versuche ich ein Programm zu verstehen, das von einem Kollegen ist, deswegen meine Überlegungen.

height_sort=np.sort(Verteilung, axis=0)

height_sort steht dabei für eine Liste (Körpergrößen), die eben sortiert werden soll.
Verteilung steht wiederum für die eigentliche Liste.

Leider weiß ich nicht, auf welche Art ich die Liste, die verwendet wird, in Python bekomme.
(Bzw. in welcher Form Listen generell importiert werden).
Die Liste hat eigentlich nur 1 Spalte, nämlich die Körpergröße.

Kann mir jemand sagen, wie ich die Liste ("Verteilung") importieren müsste, damit die nachfolgende Funktion (np.sort) bzw. das Argument (axis = 0) Sinn machen?

Vielen Dank, schöne Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Feirefitz: `height_sort` klingt nach einem Funktionsnamen, das ist verwirrend. Und es kann nicht für eine Liste stehen wenn da das Ergebnis von `numy.sort()` dran gebunden wird, weil diese Funktion keine Liste sondern ein Array als Rückgabewert hat.

Falls die Angabe von ``axis=0`` wirklich sinnvoll sein soll, dann darf aber die Eingabe keine eindimensionale Datenstruktur sein *und* der Rückgabewert ist es dann natürlich auch nicht und damit ist das Ergebnis nicht nur keine Liste, sondern auch keine Liste die so aussieht wie Du das beschreibst.

Deine Beschreibung vermischt was Du anscheinend gerne hättest, mit Code der was anderes liefert. Und es ist jetzt nicht so wirklich klar was Du eigentlich willst. Eingabedaten die mit Code Deines Kollegen funktionieren? Das wäre der `DataFrame` den Pandas aus der Exceldatei macht. Oder Eingabedaten die am einfachsten in die von Dir gewünschte/beschriebene Liste transformiert werden können? Das hat Sirius3 ja im Grunde beantwortet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Feirefitz
User
Beiträge: 7
Registriert: Montag 21. August 2023, 12:33

@ blackjack: Vielen Dank für die schnelle Antwort.
Guter Punkt, was war jetzt eigentlich meine Frage?

Ich versuche, das noch einmal konkreter zu beschreiben:
Letzlich versuche ich nur, was der bereits vorhandene Code macht, bzw. auf welche Form einer Liste er sich bezieht.
Was ich gerne hätte wäre, dass mir der Code eine Liste einliest und deren Werte aufsteigend sortiert.
Das sollte doch aber so funktionieren, oder?

import numpy as np
Verteilung = [177, 169, 163, 181, 204, 188]
height_sort=np.sort(Verteilung,axis=0)
print(height_sort)
[163 169 177 181 188 204]

Ich habe hier nur händisch eine Verteilung geschrieben.
Das heißt, mit der Funktion "height_sort=np.sort(Verteilung,axis=0)" würde ein Array als Rückgabewert herauskommen?
Und axis = 0 wäre nur dann anzuwenden, wenn ich eine Tabelle als Grundlage hätte, die sowohl Werte in x- und y-Richtung hat?

Das Ziel wäre aber, dass die Körpergrößen einfach aufsteigend sortiert werden , um mit height_sort dann weiterarbeiten zu können.

Danke, schöne Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Feirefitz: Wie gesagt, der Name `height_sort` ist falsch. Und `Verteilung` sollte klein geschrieben werden, denn so ist das ein Klassenname, siehe Style Guide for Python Code. Und dieses Denglisch sollte man sich nicht angewöhnen. Entweder `distribution` und `sorted_heights` oder `verteilung` und `sortierte_groessen`. Wobei ich eher zu Englisch tendieren würde, weil a) alles andere Englisch benannt ist, und b) im Deutschen recht oft Einzahl und Mehrzahl gleich geschrieben werden, was im Englischen sehr selten vorkommt und die Mehrzahl in der Regel auch sehr einfach durch anhängen des Mehrzahl-”s” gebildet werden kann. So Probleme wie ``for schueler in schueler:`` hat man im Englischen sehr selten.

Die Dokumentation von `numpy.sort()` sagt, dass die Funktion Arrays liefert. Die Ausgabe mit `print()` zeigt ja zumindest, dass es keine Liste ist, denn da wären Kommas zwischen den Elementen. Wenn man es genau und konkret für einen Wert wissen will, gibt es die `type()`-Funktion um den Typ von jedem beliebigen Wert zu ermitteln

Code: Alles auswählen

In [109]: import numpy as np
     ...: heights = [177, 169, 163, 181, 204, 188]
     ...: sorted_heights = np.sort(heights)
     ...: print(sorted_heights, type(sorted_heights))
[163 169 177 181 188 204] <class 'numpy.ndarray'>
Wobei man bei *diesem* Beispiel natürlich fragen muss warum da `numpy` importiert werden muss, denn man könnte ja einfach die `sorted()`-Funktion verwenden die Python schon von Haus aus mitbringt:

Code: Alles auswählen

In [110]: heights = [177, 169, 163, 181, 204, 188]
     ...: sorted_heights = sorted(heights)
     ...: print(sorted_heights, type(sorted_heights))
[163, 169, 177, 181, 188, 204] <class 'list'>
Die Angabe von `axis` ist nur sinnvoll wenn es überhaupt mehr als eine Achse/Dimension gibt. Das müssen dann nicht nur zwei sein; Numpy-Arrays können auch deutlich mehr Dimensionen haben.

Also momentan sieht es immer noch nach der Lösung von Sirius3 aus, die am einfachsten wäre was Zusatzbibliotheken angeht. Pandas benutzt ja auch `openpyxl` zum Einlesen, und das was Du haben willst, klingt bis jetzt nicht danach als würde Pandas selbst benötigt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Feirefitz
User
Beiträge: 7
Registriert: Montag 21. August 2023, 12:33

Super, vielen Dank, ich werde mir das ansehen.
Antworten