J'ai un ensemble de données comme celui-ci:
Exemple de trame de données
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]})
Je voudrais remplacer certains des 0
dans col1
et col2
par 1
des, mais pas remplacer les 0
si trois ou plus 0
sont consécutifs dans la même colonne. Comment cela peut-il être fait avec les pandas?
Jeu de données d'origine:
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
Ensemble de données souhaité:
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
cependant, cela laisse les deux premières et dernières lignes intactesRéponses:
Considérez l'approche suivante:
Pas à pas:
la source
col.groupby((col != col.shift()).cumsum())
. note :,groupby(by, ...)
iciby
peut être un dict ou une série, quand un dict ou une série est passé, les valeurs de la série ou du dict seront utilisées pour déterminer les groupes.Vous devez utiliser
pandas.DataFrame.shift()
pour trouver le modèle dont vous avez besoin.Code:
Code de test:
Résultats:
la source
La réponse de @Stephen Rauch est très intelligente, mais elle est lente lorsque je l'ai appliquée à un grand ensemble de données. Inspiré par ce post , je pense avoir obtenu un moyen plus efficace d'atteindre le même objectif.
Le code:
Résultats:
la source