Seite 1 von 1

Abschnitt aus DataFrame erhalten

Verfasst: Montag 17. Oktober 2022, 14:17
von Wallower
Hallo!

Ich brauche Rat. Und zwar importiert mein Programm eine Excel-Datei von diesem Format (in Gelb stehen zur Hilfe die Zeilen- und Spaltenindizes):
Bild

In den grünen Spalten stehen jeweils irgendwelche mehrfach vorkommenden Dinge, in Spalte j beispielsweise b, a, b, b, d, a, e, ... Der Anwender soll nun eine der grünen Spalten auswählen, z.B. Spalte j. Dann soll mein Programm jeweils den Mittelwert aller Zeiten berechnen, die in Spalte j denselben Eintrag haben, also Mittelwert aller Zeiten mit Eintrag "a", Mittelwert aller Zeiten mit Eintrag "b" usw.

Meine Idee/mein Minimalprogramm:

Code: Alles auswählen

from numpy import *
import pandas as pd

pfad = str(input("Pfad der Excel-Datei: "))
data = pd.read_excel(pfad, header=0)
header = data.columns.values.tolist()

print("Spalte wählen: ")
for i in range(1, len(header)):
    print(f"{i} {header[i]}")
spaltenindex = int(input("Nummer des Spalte: "))

# Die verschiedenen Einträge der gewählten Spalte als Liste
eintraege = list(set(data.iloc[:,spaltenindex]))

# Die "Zeit"-Spalte
zeit = data.iloc[:,0]
Ab hier hapert es. Angenommen, ich will alle Zeiten, die in Spalte j ein "e" stehen haben ("e" hätte in der eintraege-Liste den Index 4). Folgendes funktioniert dann leider nicht:

Code: Alles auswählen

zeiten_e = zeit[where(data.iloc[:,spaltenindex] == eintraege[4])]
print(zeiten_e)
Es kommt die Fehlermeldung "TypeError: 'method' object is not subscriptable". Was mache ich falsch? Danke für eure Hilfe!

Re: Abschnitt aus DataFrame erhalten

Verfasst: Montag 17. Oktober 2022, 16:26
von einfachTobi
*-Importe sind böse. Die gängige Form numpy zu importieren ist import numpy as np. Wenn man mit Schleifen auf Numpy-Arrays oder Pandas-Dataframes los geht, macht man in der Regel etwas verkehrt.
Du suchst groupby.

Code: Alles auswählen

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(data={"zeit": [0, 1, 2, 3 ,4 ], "spalte_1": [0, 1,2,3,4], "spalte_2": ["a", "b", "a", "c", "a"]})

In [3]: df
Out[3]:
   zeit  spalte_1 spalte_2
0     0         0        a
1     1         1        b
2     2         2        a
3     3         3        c
4     4         4        a

In [4]: df.groupby("spalte_2").mean()
Out[4]:
          zeit  spalte_1
spalte_2
a          2.0       2.0
b          1.0       1.0
c          3.0       3.0
In Python iteriert man nicht über einen Index, sondern direkt über die Elemente. Falls man zusätzlich eine Nummerierung benötigt, gibt es enumerate.

Code: Alles auswählen

for i, thing in enumerate(["element", "noch ein element", "ein drittes element"], start=1):
    print(i, thing)

Re: Abschnitt aus DataFrame erhalten

Verfasst: Montag 17. Oktober 2022, 17:05
von Wallower
Danke für deine Hilfe, sogar mit Code! :)
einfachTobi hat geschrieben: Montag 17. Oktober 2022, 16:26 *-Importe sind böse.
Oha, warum? Wir hatten das in der ersten Programmiersitzung gesehen und habe es nicht ernsthaft hinterfragt.
einfachTobi hat geschrieben: Montag 17. Oktober 2022, 16:26 Die gängige Form numpy zu importieren ist import numpy as np. Wenn man mit Schleifen auf Numpy-Arrays oder Pandas-Dataframes los geht, macht man in der Regel etwas verkehrt.
Weil es dann leicht zu Fehlern kommt oder weil diese Bibliotheken mit so angelegt sind, dass man keine Schleifen braucht?

Re: Abschnitt aus DataFrame erhalten

Verfasst: Montag 17. Oktober 2022, 17:40
von Sirius3
*-Importe sind schlecht, weil man nicht nachvollziehen kann, woher welcher Name kommt. Bei numpy sind das über 600 Namen, darunter solche, die eingebaute Funktionen überschreiben, wie min, max, sum, etc. Das heißt, durch den Import funktionieren manche Funktionen, die man kennt, nicht mehr so wie erwartet. Das führt zu schwer zu findenden Fehlern.
Schleifen benutzt man nicht, weil es viel mächtigere Funktionen gibt, die viele Aufgaben viel klarer und damit mit weniger Fehlern umsetzen. Ja die Bibliotheken sind so angelegt.

Re: Abschnitt aus DataFrame erhalten

Verfasst: Sonntag 30. Oktober 2022, 07:38
von Wallower
Danke für die Erklärungen! War mir bis jetzt nicht bewusst!