Wertwechsel in pandas-String-Spalte/Serie erkennen

English Deutsch

TL;DR

Um eine Serie zu erhalten, die jedes Mal True ist, wenn sich die Eingabe-String-Spalte ändert, verwenden Sie

example.py
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

example.py
my_column_changes.iloc[0] = False

Um die Zeilen im DataFrame zu erhalten, in denen sich die Spalte ändert, verwenden Sie

example.py
df[my_column_changes]

oder verwenden Sie diesen Einzeiler:

example.py
df[df["MyStringColumn"].shift() != df["MyStringColumn"]]

Um diesen Wert einer neuen Spalte im DataFrame zuzuweisen, verwenden Sie z.B.

example.py
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:

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)

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:

example.py
df["SinePositive"] = (df["Sine"] >= 0).map({True: "Positive", False: "Negative"})

Nun erstellen wir die ZeroCrossing-Spalte mit der oben gezeigten Methode:

example.py
# "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:

example.py
df["ZeroCrossing"].iloc[0] = False

Nun können wir

example.py
df[df["ZeroCrossing"]]

verwenden, um die Zeilen im DataFrame anzuzeigen, in denen der Nulldurchgang stattgefunden hat:

output.txt
                                    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          True

Vollständiger Beispielcode:

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

# Ergebnis ausgeben
print(df[df["ZeroCrossing"]])

Check out similar posts by category: Pandas, Python