Datenauswertung in Schleife

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

Hallo zusammen, ich bin neu hier und muss auch zugeben, dass ich noch ziemlich neu in der Programmiersprache bin. Nun muss ich große Mengen an Daten auswerten. Ich habe aus insgesamt 8 Messungen csv-Dateien, die ich in einer Schleife auslese. Dabei habe ich nun versucht mir das als Liste und als DataFrame ausgeben zu lassen. Klappt mit der Liste, so dass ich dort eine Liste von DataFrames bekomme. Beim DataFrame bleiben allerdings die Spalten, die ich ab dem zweiten i-Wert bekomme, mit nans gefüllt. Woran kann das liegen? Eigentlich möchte ich aber pro Messung ein DataFrame herausbekommen, mit dem ich dann weiterarbeiten kann.

Hier mein Code. Wäre toll, wenn ihr Tips habt.

data_ges = pd.DataFrame() #leeres DataFrame
data =[]
groessen = ['0,5','1','5'] # gleich Partikelgrößen
exp = ['5', '6', '8', '9', '10', '11', '12', '13']

for i in exp:
variable1 = i
for j in groessen:
variable2 = j
df= pd.read_csv('M' + variable1 + '/Files_Partikel_M' + variable1 + '/' + variable2 + '.csv', sep = ';', header=None, usecols=[0,1], names =['Zeit: M' +variable1 + '_'+ variable2, 'M' +variable1 + '_'+ variable2])
df = df.drop([0,1])

df.insert(1,'Minuten',0,True) #neue Spalte 'Sekunden' an Position 1 mit Nullen einfügen
df.insert(2,'Sekunden',0,True)

a=1.025 #Zeitschritte der Messung
for zeile in range(len(df)):

if zeile>0:

df.iloc[zeile,1] = df.iloc[zeile-1,1] + a
df.iloc[zeile,2] = df.iloc[zeile,1]*60
data_ges = data_ges.append(df) # füllen von leerem DataFrame, aber bloß Spaltennamen, Rest bleibt nan, keine Ahnung warum
data.append(df)
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Als erstes mußt Du verständliche Variablennamen verwenden, damit man den Code überhaupt lesen kann.
`groessen` für Partikelgrößen ist gut, aber exp? expression, exponent, export, explodiert? `i` ist dann ein ganz schlechter Name für ein Exemplar von diesem exp. Das nennst Du dann auch gleich in variable1 um, warum dann nicht gleich richtig?
Statt j böte sich auch groesse an.
Strings setzt man nicht mit + zusammen, sondern benutzt Formatstrings.
Wenn Du die ersten zwei Zeilen nicht lesen willst, dann benutze skiprow
Wenn man mit Pandas eine for-Schleife benutzt, macht man meist etwas falsch.

Code: Alles auswählen

groessen = ['0,5','1','5'] # gleich Partikelgrößen
experimente = ['5', '6', '8', '9', '10', '11', '12', '13']

data_ges = pd.DataFrame() #leeres DataFrame
for experiment in experimente:
    for groesse in groessen:
        filename = f"M{experiment}/Files_Partikel_M{experiment}/{groesse}.csv"
        df = pd.read_csv(filename, sep=';', header=None, usecols=[0,1], names=[f'Zeit: M{experiment}_{groesse}', f'M{experiment}_{groesse}'], skiprow=2)
        df.insert(1, 'Minuten', df.index * 1.025, True)
        df.insert(2, 'Sekunden', df.index * (1.025 * 60), True)
        data_ges = data_ges.append(df)
Jetzt haben Deine Dataframes alle unterschiedliche Überschriften. Natürlich werden dann die Spalten mit 'NaN' gefüllt, die in den anderen Dataframes nicht vorkommen. Irgendwass muß da ja hin.
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

danke schon mal für deine antwort. nun hab ich ein großes dataframe, das ich aber gerne in 8 stück unterteilt hätte. bzw macht es das schwierig nun auf die werte zurückzugreifen aus dem großen df. ich will zum beispiel nun mittelwerte aus spalten plotten. das geht natürlich nur ohne die nans, snst gibt es mir wieder eine fehlermeldung raus.

vielleicht ginge doch der weg mit der list, in der am ende dataframes stehen. wie kann ich denn hier auf einzelne spalten zurückgreifen.
z.b. wenn ich eine liste aus 10 dataframes habe, bei der ich aus dem dataframe, das in der 3. zeile steht, die 2. spalte brauchen zum rechnen.
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, Dein Dateframe ist halt nicht sinnvoll. Statt Daten in den Spaltennamen zu speichern sollten das eigene Spalten sein. Dann kann man mit dem Dataframe auch arbeiten.
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

könntest du mir dazu ein beispiel geben? weiß nicht genau was du meinst
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast pro Datei zwei Spalten, Zeit und Irgendwas. Du nennst Die dann Zeit_2_5, Zeit_2_6, Zeit_2_7 usw. Statt aber diese Experimentnummer und die Größe in den Spaltennamen hineinzuschreiben, solltest Du dafür neue Spalten haben, also Insgesamt: Experimentnummer, Größe, Zeit und Irgendwas. Dann gib es auch keine NaNs.
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Stichwort für Suchmaschinen ist „tidy data“. In die Spalten gehören Variablen und in die Zeilen die beobachteten Werte.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

ah o.k. also meint ihr es ist schlauer, wenn ich das am ende in dieser form habe:

Experiment Zeit Minuten Sekunden Groesse Wert

Also steht am ende alles in einem DataFrame, bloß anders sortiert?!
weiß noch nicht genau wie ich das dann aus den csv innerhalb der schleife einlese, aber das versuche ich jetzt mal. bin auch da wieder über jeden tip froh!
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Tipp wäre, endlich ein Pandas-Tutorial durchzuarbeiten.
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

ja das wäre auch mein Tip. Allerdings habe ich da leider gerade keine Zeit für, da ich 2 Kids, 2 Jobs und ne Masterarbeit zu bewältigen habe. Das steht aber schon fest auf meiner ToDo-Liste für nach der Masterarbeit. Nun muss ich mich da leider so durchhangeln.

Ich habe es jetzt geschafft, dass es eine neue Spalte gibt, die immer die richtige Messung beinhaltet. Leider weiß ich aber nicht wie ich die Daten in der Schleife als neue Zeilen hinten dranhänge. Bisher werden es immer nur neue Spalten und der Rest wird wie bisher mit nans gefüllt.
clau.13
User
Beiträge: 6
Registriert: Freitag 30. Oktober 2020, 11:27

Hab es nun so gelöst! Danke für eure Hilfe!

Code: Alles auswählen

data_ges = pd.DataFrame() #leeres DataFrame
data =[] 
groessen = ['0,5','1','5'] # gleich Partikelgrößen
experimente = ['5', '6', '8', '9', '10', '11', '12', '13']

for experiment in experimente:
         for groesse in groessen:
       	 filename  = f"M{experiment}/Files_Partikel_M{experiment}/{groesse}.csv"
         df = pd.read_csv(filename, sep=';', header=None, usecols=[0,1], names=['Zeit', 'Partikelanzahl'])
         df = df.drop([0,1])
        
         df.insert(0, 'Experiment', f"M{experiment}", True) 
         df.insert(1, 'Groesse', f"{groesse}", True)
         df.insert(3, 'Minuten', df.index * 1.025, True)
         df.insert(4, 'Sekunden', df.index * (1.025 * 60), True)
         data_ges = data_ges.append(df) 
         data.append(df)
        
Antworten