pandas DataFrame jedes Mal aufteilen, wenn eine Spalte True ist
English
Deutsch
TL;DR
Wenn die Series, die Sie zum Aufteilen verwenden möchten, eine Spalte im DataFrame ist, lesen Sie diesen Beitrag weiter. Andernfalls lesen Sie pandas DataFrame jedes Mal aufteilen, wenn eine Series True ist.
Verwenden Sie diese Hilfsfunktion:
split_dataframe_by_column.py
def split_dataframe_by_column(df, column):
"""
DataFrame aufteilen, wenn eine Spalte True ist. Ergibt mehrere DataFrames
"""
previous_index = df.index[0]
for split_point in df[df[column]].index:
yield df[previous_index:split_point]
previous_index = split_point
# Rest des Datensatzes ausgeben
try:
yield df[split_point:]
except UnboundLocalError:
pass # Es gibt keinen Aufteilungspunkt => Ignorieren
# Verwendungsbeispiel:
list(split_dataframe_by_column(df, "ZeroCrossing"))Beachten Sie, dass einer oder mehrere dieser DataFrames leer sein könnten.
Vollständiges Beispiel:
Wir verwenden die ZeroCrossing-Spalte, die wir in unserem vorherigen Beitrag über Wertwechsel in pandas-String-Spalte/Serie erkennen erstellt haben und die auf unserem Beitrag über pandas-Zeitreihen-DataFrame-Beispieldatensatz erstellen aufbaut. Basierend auf diesem Beispiel fügen wir die oben gezeigte Hilfsfunktion hinzu:
split_timeseries_example.py
import pandas as pd
# Vorgefertigten Zeitreihen-Beispieldatensatz laden
df = pd.read_csv("https://techoverflow.net/datasets/timeseries-example.csv", parse_dates=["Timestamp"])
df.set_index("Timestamp", inplace=True)
# Neue Spalte mit "Positive" oder "Negative" erstellen
df["SinePositive"] = (df["Sine"] >= 0).map({True: "Positive", False: "Negative"})
# "Wechsel"-Spalte (boolesch) erstellen
df["ZeroCrossing"] = df["SinePositive"].shift() != df["SinePositive"]
# Ersten Eintrag auf False setzen
df["ZeroCrossing"].iloc[0] = False
def split_dataframe_by_column(df, column):
"""DataFrame aufteilen, wenn eine Spalte True ist. Ergibt mehrere DataFrames"""
previous_index = df.index[0]
for split_point in df[df[column]].index:
yield df[previous_index:split_point]
previous_index = split_point
# Rest des Datensatzes ausgeben
try:
yield df[split_point:]
except UnboundLocalError:
pass # Es gibt keinen Aufteilungspunkt => Ignorieren
# Ergebnis ausgeben
split_frames = list(split_dataframe_by_column(df, "ZeroCrossing"))
print(f"Split DataFrame into {len(split_frames)} separate frames by zero-crossing")
# Dies gibt "Split DataFrame into 20 separate frames by zero-crossing" ausIf this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow