Seite 1 von 1

DataFrame ausdünnen mithilfe von Slicing

Verfasst: Dienstag 5. Januar 2021, 17:24
von Ameinsenpeter
Hallo liebe Community,
ich habe ein DataFrame voll mit Messwerten( knapp 470'000 Zeilen). Im DataFrame befinden sich Messwerte eines Sensors der bei verschiedenen Betriebsparametern betrieben wird.
Ich möchte den Sensor bei seinen verschiedenen Betriebsparametern analysieren. Dabei ist es wichtig, nur jeweils die letzten 10 Messwerte (da sich Sensor einpendeln muss) einer Betriebsparameterkombination zu erhalten. Daher möchte ich aus dem ursprünglichen DataFrame ein ausgedünntes DataFrame erstellen, das nur aus den erwähnten letzten 10 Messwerten jeder Kombination besteht.
Mein ursprüngliches DataFrame sieht wie folgt aus: https://ibb.co/DwJTf5q. Die verschieden Indizes spiegeln die Betriebparameter, sowie Messablauf wieder.
Ich habe nun ein bisschen Code geschrieben, der mein Anliegen erfüllt, aber leider sehr ineffizient ist. Dabei wird durch alle Indizes iteriert und ein neues DataFrame konkateniert.
Der Code sieht so aus:

Code: Alles auswählen

start_time = time.time()
minparamzyklus = mwti['Param-Zyklus'].min()
maxparamzyklus = mwti['Param-Zyklus'].max()
minparam_H_ID = mwti['Param-H-ID'].min()
maxparam_H_ID = mwti['Param-H-ID'].max()
minparam_EL_ID = mwti['Param-EL-ID'].min()
maxparam_EL_ID = mwti['Param-EL-ID'].max()
minDruck_Zyklus = mwti['Druck-Zyklus'].min()
maxDruck_Zyklus = mwti['Druck-Zyklus'].max()
minDruck_Stufe = mwti['Druck-ID'].min()
maxDruck_Stufe = mwti['Druck-ID'].max()
newfr = pd.DataFrame()
print(maxparamzyklus,maxparam_H_ID,maxparam_EL_ID,maxDruck_Zyklus,maxDruck_Stufe)
for param_zyklus in range(minparamzyklus,maxparamzyklus+1):    
    for param_h_id in range(minparam_H_ID,maxparam_H_ID+1):
        for param_el_id in range(minparam_EL_ID,maxparam_EL_ID+1):    
            for druck_zyklus in range(minDruck_Zyklus,maxDruck_Zyklus+1):
                for druck_stufe in range(minDruck_Stufe,maxDruck_Stufe+1):
                    anhang = mwti.loc[pd.IndexSlice[param_zyklus,param_h_id,param_el_id,druck_zyklus,druck_stufe,:],:].iloc[-10:]
                    newfr = pd.concat([newfr,anhang])
print('--- %s Sekunden ---' %(time.time()-start_time))
Leider braucht dieser Code knapp 8 Minuten :oops: .
Daher meine Frage, ist mein Anliegen auch einfacher zu lösen, zum Beispiel mit IndexSlicing?
Wäre dankbar für jegliche Vorschläge, die meine Rechenzeit verringern.
Grüße Peter

Re: DataFrame ausdünnen mithilfe von Slicing

Verfasst: Dienstag 5. Januar 2021, 18:11
von __blackjack__
@Ameinsenpeter: Gruppieren und von jeder Gruppe die letzten 10 Werte nehmen wäre wohl der Ansatz.

Re: DataFrame ausdünnen mithilfe von Slicing

Verfasst: Donnerstag 7. Januar 2021, 13:15
von Ameinsenpeter
@Blackjack, danke das war die Lösung, das funktioniert in Sekundenbruchteilen :D Hab groupby bisher nie benutzt und daher auch nicht dran gedacht, dass das die Lösung sein könnte.
Gruß Peter