Pandas "diff ()" mit String

Wie kann ich eine Zeile in einem Dataframe jedes Mal markieren, wenn eine Spalte ihren String-Wert ändert?

Ex:

Eingang

ColumnA ColumnB 1 Blue 2 Blue 3 Red 4 Red 5 Yellow # diff won't work here with strings.... only works in numerical values dataframe['changed'] = dataframe['ColumnB'].diff() ColumnA ColumnB changed 1 Blue 0 2 Blue 0 3 Red 1 4 Red 0 5 Yellow 1 

3 Solutions collect form web for “Pandas "diff ()" mit String”

Ich bekomme bessere Leistung mit ne anstatt mit der tatsächlichen != Vergleich:

 df['changed'] = df['ColumnB'].ne(df['ColumnB'].shift().bfill()).astype(int) 

Timings

Verwenden Sie das folgende Setup, um ein größeres Datenfeld zu erstellen:

 df = pd.concat([df]*10**5, ignore_index=True) 

Ich bekomme folgende Timings:

 %timeit df['ColumnB'].ne(df['ColumnB'].shift().bfill()).astype(int) 10 loops, best of 3: 38.1 ms per loop %timeit (df.ColumnB != df.ColumnB.shift()).astype(int) 10 loops, best of 3: 77.7 ms per loop %timeit df['ColumnB'] == df['ColumnB'].shift(1).fillna(df['ColumnB']) 10 loops, best of 3: 99.6 ms per loop %timeit (df.ColumnB.ne(df.ColumnB.shift())).astype(int) 10 loops, best of 3: 19.3 ms per loop 

Verwenden Sie .shift und vergleichen Sie:

 dataframe['changed'] = dataframe['ColumnB'] == dataframe['ColumnB'].shift(1).fillna(dataframe['ColumnB']) 

Für mich arbeitet Vergleich mit shift , dann wurde NaN ersetzt 0 weil vor kein Wert:

 df['diff'] = (df.ColumnB != df.ColumnB.shift()).astype(int) df.ix[0,'diff'] = 0 print (df) ColumnA ColumnB diff 0 1 Blue 0 1 2 Blue 0 2 3 Red 1 3 4 Red 0 4 5 Yellow 1 

Bearbeiten von Timings einer anderen Antwort – am schnellsten ist ne :

 df['diff'] = (df.ColumnB.ne(df.ColumnB.shift())).astype(int) df.ix[0,'diff'] = 0 
  • Pandas: Änderungsdatum im Dataframe zum gleichen Datumsformat
  • Erhalten Sie die Liste der Pandas-Dataframe-Spalten, die auf dem Datentyp basieren
  • Pandas Dataframe aus verschachteltem Wörterbuch
  • Python-Selen-Schaben tbody
  • Wiederholen Sie ein Pandas-Dataframe durch einen beliebigen Faktor
  • Äußere Verschmelzung von zwei Datenrahmen in pandas
  • PANDAs erstellen eine Ordinale aufsteigende Wertspalte innerhalb der Gruppe
  • Wie man Formeln anstelle von Werten in pandas DataFrame speichert
  • Wie man eine Spalte in Pandas DataFrame verschiebt, ohne Wert zu verlieren
  • Boolesche Indizierung, die einen Blick auf ein großes Pandas-Dataframe erzeugen kann?
  • Wie kann man überprüfen, ob ein Wert in der Liste in der Auswahl aus dem Pandas-Datenrahmen ist?
  • Python ist die beste Programmiersprache der Welt.