Ich habe einen Datensatz wie diesen:
Beispieldatenrahmen
import pandas as pd
df = pd.DataFrame({
'names': ['A','B','C','D','E','F','G','H','I','J','K','L'],
'col1': [0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0],
'col2': [0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0]})
Ich möchte einige der 0
's in col1
und col2
durch 1
' s ersetzen, aber nicht die 0
's, wenn drei oder mehr 0
in derselben Spalte aufeinander folgen. Wie geht das mit Pandas?
Originaldatensatz:
names col1 col2
A 0 0
B 1 0
C 0 0
D 1 0
E 1 1
F 1 0
G 0 1
H 0 0
I 0 1
J 1 0
K 0 0
L 0 0
Gewünschter Datensatz:
names col1 col2
A 1 0
B 1 0
C 1 0
D 1 0
E 1 1
F 1 1
G 0 1
H 0 1
I 0 1
J 1 0
K 1 0
L 1 0
col2
?df.loc[(df['col1']+df['col1'].shift(1)+df['col1'].shift(2)>0)&(df['col1']+df['col1'].shift(1)+df['col1'].shift(-1)>0)&(df['col1']+df['col1'].shift(-1)+df['col1'].shift(-2)>0)]=1
Dies lässt jedoch die erste und die letzten beiden Zeilen unberührtAntworten:
Betrachten Sie den folgenden Ansatz:
Schritt für Schritt:
quelle
col.groupby((col != col.shift()).cumsum())
. Hinweis:groupby(by, ...)
Hierby
kann es sich um ein Diktat oder eine Serie handeln. Wenn ein Diktat oder eine Serie übergeben wird, werden die Gruppen- oder Diktatwerte verwendet, um die Gruppen zu bestimmen.Sie sollten verwenden
pandas.DataFrame.shift()
, um das gewünschte Muster zu finden.Code:
Testcode:
Ergebnisse:
quelle
Die Antwort von @Stephen Rauch ist sehr klug, aber langsam, wenn ich sie auf einen großen Datensatz anwende. Inspiriert von diesem Beitrag denke ich, dass ich einen effizienteren Weg gefunden habe, um das gleiche Ziel zu erreichen.
Der Code:
Ergebnisse:
quelle