Dataframe beschneiden

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
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

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
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

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)])
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Guter Hinweis, sonst hätte man den Unterschied schnell übersehen können.

@MRO5494: Was genau ist deine Anforderung?
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Ich habe es so gemeint wie von blackJack beschrieben. Danke Leute!

Und sorry für die nicht eindeutige Beschreibung.
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Hallo Leute,

Ich habe noch eine Frage.

Gibt es folgenden Befehl auch für eine Liste?

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