Seite 1 von 1

Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 12:37
von MRO5494
Hallo Leute,

Ich habe folgendes Problem ich bekomme immer folgendes Dataframe zugespielt:

Cycle_No sp CA_Rel_Cyl
14 720 640
14 720 641
... ... ....
... ... ....
14 720 1000
15 720 280
15 720 281
... ... ...
15 720 999
15 720 1000
16 720 280
16 720 281
... ... ...
... ... ...
16 720 400


Nun möchte ich eine Funktion haben, die meine Daten so beschneidet, dass ich sage schneide alle Zeilen oberhalb weg, bis CA_Rel_Cyl das erste mal den Wert 280 aufweist.

Weiterhin möchte ich ab da eine Funktion haben, die alle Werte abschneidet nach dem bei CA_Rel_Cyl wieder den Wert 1000 erreicht.

Ich habe es wie folgt probiert, bzw stelle es mir wie folgt vor:

#Falls Wert in Spalte nicht 280.25 lösche Zeilen, ist der Wert erreicht break
for wert in df['CA_Rel_Cyl']:
if wert !=280.25:
df = df.drop
else:
break
print(df)

#Wenn Wert 1000 in Spalte erreicht ist, lösche nachfolgende Zeilen
for wert in df['CA_Rel_Cyl']:
if wert == 1000:
del

Re: Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 12:59
von __blackjack__
Statt aus dem DataFrame etwas zu löschen, was auch nicht wirklich geht, ist es einfacher die gewünschten Daten zu selektieren. Beispielsweise so:

Code: Alles auswählen

In [29]: df                                                                     
Out[29]: 
   Cycle_No   sp  CA_Rel_Cyl
0        14  720         640
1        14  720         641
2        14  720        1000
3        15  720         280
4        15  720         281
5        15  720         999
6        15  720        1000
7        16  720         280
8        16  720         281
9        16  720         400

In [30]: a = (df["CA_Rel_Cyl"] == 280).idxmax()                                 

In [31]: b = (df["CA_Rel_Cyl"][a:] == 1000).idxmax()                            

In [32]: a, b                                                                   
Out[32]: (3, 6)

In [33]: df.loc[a:b]                                                            
Out[33]: 
   Cycle_No   sp  CA_Rel_Cyl
3        15  720         280
4        15  720         281
5        15  720         999
6        15  720        1000

Re: Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 13:00
von einfachTobi
Guter Merksatz: Über DataFrames und Arrays zu iterieren ist in der Regel falsch.
Wenn die Werte zwischen den Intervallgrenzen nicht aus dem Wertebereich fallen können, kannst du einfach die entsprechenden Zeilen filtern:

Code: Alles auswählen

messwerte = pd.DataFrame({
            'Cycle_No': [14, 14, 14, 15, 15, 15, 15, 16, 16, 16],
            'sp': [720, 720, 720, 720, 720, 720, 720, 720, 720, 720],
            'CA_Rel_Cyl': [100, 641, 1005, 280, 281, 999, 1000, 265, 281, 400]
            })
print(messwerte[(messwerte['CA_Rel_Cyl'] >= 280) & (messwerte['CA_Rel_Cyl'] <= 1000)])

Re: Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 13:08
von __blackjack__
@einfachTobi: Wobei das nicht nur die Zeilen für den ersten Block liefert sondern alle Zeilen die in diesem Intervall liegen. Das kann gewollt sein, kann aber auch ungewollt sein. In den Beispieldaten war ja vor der ersten 280 schon mal eine 1000 und ich hatte den Beitrag so verstanden das diese Zeile *nicht* im Ergebnis sein sollte, sondern alles (inklusive) der ersten 280 und der *darauf folgenden* ersten 1000. In den vom TE gezeigten Beispieldaten würde das zudem einfach *alles* selektieren. Kann natürlich auch sein das die Beispieldaten ungünstig gewählt wurden.

Re: Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 13:20
von einfachTobi
Guter Hinweis, sonst hätte man den Unterschied schnell übersehen können.

@MRO5494: Was genau ist deine Anforderung?

Re: Dataframe beschneiden

Verfasst: Donnerstag 13. Februar 2020, 16:30
von MRO5494
Ich habe es so gemeint wie von blackJack beschrieben. Danke Leute!

Und sorry für die nicht eindeutige Beschreibung.

Re: Dataframe beschneiden

Verfasst: Montag 2. März 2020, 11:37
von MRO5494
Hallo Leute,

Ich habe noch eine Frage.

Gibt es folgenden Befehl auch für eine Liste?

a = (df["CA_Rel_Cyl"] == 280).idxmax()