Tengo un conjunto de datos como este:
Marco de datos de muestra
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]})
Me gustaría reemplazar algunos de los 0
's en col1
y col2
con 1
' s, pero no reemplazar los 0
's si tres o más 0
son consecutivos en la misma columna. ¿Cómo se puede hacer esto con los pandas?
Conjunto de datos original:
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
Conjunto de datos deseado:
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
sin embargo, esto deja intactas las dos primeras y últimas filasRespuestas:
Considere el siguiente enfoque:
Paso a paso:
fuente
col.groupby((col != col.shift()).cumsum())
. nota:groupby(by, ...)
aquíby
puede haber un dict o una serie, cuando se pasa un dict o una serie, los valores de la serie o el dict se utilizarán para determinar los grupos.Debe usar
pandas.DataFrame.shift()
para encontrar el patrón que necesita.Código:
Código de prueba:
Resultados:
fuente
La respuesta de @Stephen Rauch es muy inteligente, pero es lenta cuando la apliqué a un gran conjunto de datos. Inspirado en esta publicación , creo que obtuve una forma más eficiente de lograr el mismo objetivo.
El código:
Resultados:
fuente