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
Dataframe beschneiden
- __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
-
- 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:
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)])
- __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
-
- 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: Was genau ist deine Anforderung?