Wertwechsel in pandas-String-Spalte/Serie erkennen
TL;DR
Um eine Serie zu erhalten, die jedes Mal True ist, wenn sich die Eingabe-String-Spalte ändert, verwenden Sie
my_column_changes = df["MyStringColumn"].shift() != df["MyStringColumn"]Der erste Wert dieser Series ist immer True, da der Wert vor dem Beginn der Serie als NaN betrachtet wird (aufgrund des Verhaltens von shift()). Um den ersten Wert auf False zu setzen, verwenden Sie
my_column_changes.iloc[0] = FalseUm die Zeilen im DataFrame zu erhalten, in denen sich die Spalte ändert, verwenden Sie
df[my_column_changes]oder verwenden Sie diesen Einzeiler:
df[df["MyStringColumn"].shift() != df["MyStringColumn"]]Um diesen Wert einer neuen Spalte im DataFrame zuzuweisen, verwenden Sie z.B.
df["MyStringColumnChanges"] = df["MyStringColumn"].shift() != df["MyStringColumn"]Vollständiges Beispiel:
Zuerst laden wir unser Beispiel aus unserem vorherigen Beitrag über pandas-Zeitreihen-DataFrame-Beispieldatensatz erstellen:
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)Nun erstellen wir eine neue Spalte, die Positive enthält, wenn der Sinuswellen-Wert in der "Sine"-Spalte positiv ist, oder "Negative", wenn dieser Wert negativ ist:
df["SinePositive"] = (df["Sine"] >= 0).map({True: "Positive", False: "Negative"})Nun erstellen wir die ZeroCrossing-Spalte mit der oben gezeigten Methode:
# "Wechsel"-Spalte (boolesch) erstellen
df["ZeroCrossing"] = df["SinePositive"].shift() != df["SinePositive"]… und setzen den ersten Eintrag auf False, da wir den Beginn der Serie nicht als Nulldurchgang betrachten:
df["ZeroCrossing"].iloc[0] = FalseNun können wir
df[df["ZeroCrossing"]]verwenden, um die Zeilen im DataFrame anzuzeigen, in denen der Nulldurchgang stattgefunden hat:
Sine Cosine SinePositive ZeroCrossing
Timestamp
2020-05-25 20:05:10.040874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.090874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.140874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.190874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.240874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.290874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.340874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.390874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.440774 -2.450532e-15 -1.00000 Negative True
2020-05-25 20:05:10.490874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.540874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.590874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.640774 -1.960673e-15 -1.00000 Negative True
2020-05-25 20:05:10.690874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.740874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.790874 6.283144e-03 0.99998 Positive True
2020-05-25 20:05:10.840874 -6.283144e-03 -0.99998 Negative True
2020-05-25 20:05:10.890774 4.901063e-15 1.00000 Positive True
2020-05-25 20:05:10.940874 -6.283144e-03 -0.99998 Negative TrueVollständiger Beispielcode:
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
# Ergebnis ausgeben
print(df[df["ZeroCrossing"]])