Eu tenho um conjunto de dados como este:
Dataframe de amostra
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]})
Eu gostaria de substituir alguns dos 0
itens dentro col1
e col2
com 1
os, mas não substituir os 0
se três ou mais 0
forem consecutivos na mesma coluna. Como isso pode ser feito com os pandas?
Conjunto de dados 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 dados desejado:
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
no entanto, isso deixa intocadas as duas primeiras e as últimas duas linhasRespostas:
Considere a seguinte abordagem:
Passo a passo:
fonte
col.groupby((col != col.shift()).cumsum())
. Nota:groupby(by, ...)
aquiby
pode ser um ditado ou uma série; quando um ditado ou uma série for aprovada, os valores da série ou do ditado serão usados para determinar os grupos.Você deve usar
pandas.DataFrame.shift()
para encontrar o padrão necessário.Código:
Código do teste:
Resultados:
fonte
A resposta de Stephen Rauch é muito inteligente, mas é lenta quando eu a apliquei em um grande conjunto de dados. Inspirado por este post , acho que tenho uma maneira mais eficiente de atingir o mesmo objetivo.
O código:
Resultados:
fonte