Mam taki zestaw danych:
Przykładowa ramka danych
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]})
Chciałbym zastąpić część 0
jest w col1
i col2
z 1
jest, ale nie zastępują 0
JEŻELI trzy lub więcej 0
'S są sąsiednie w tej samej kolumnie. Jak można to zrobić za pomocą pand?
Oryginalny zestaw danych:
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
Pożądany zestaw danych:
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
pozostawia to jednak nietknięte pierwsze i ostatnie dwa rzędyOdpowiedzi:
Rozważ następujące podejście:
Krok po kroku:
źródło
col.groupby((col != col.shift()).cumsum())
. uwaga:groupby(by, ...)
tutajby
może być dykt lub Seria, po przekazaniu dykta lub Serii, Serie lub WARTOŚCI dykt zostaną użyte do ustalenia grup.Powinieneś użyć,
pandas.DataFrame.shift()
aby znaleźć potrzebny wzór.Kod:
Kod testowy:
Wyniki:
źródło
Odpowiedź Stephena Raucha jest bardzo mądra, ale powolna, gdy zastosowałem ją do dużego zestawu danych. Zainspirowany tym postem , myślę, że mam bardziej skuteczny sposób na osiągnięcie tego samego celu.
Kod:
Wyniki:
źródło