У меня есть такой набор данных:
Примерный фрейм данных
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]})
Я хотел бы заменить некоторые из 0
«s в col1
и col2
с 1
» s, но не заменить 0
«S , если три или более 0
» s являются последовательными в том же столбце. Как это можно сделать с пандами?
Исходный набор данных:
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
Желаемый набор данных:
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
однако, это оставляет первые и последние два ряда нетронутымиОтветы:
Рассмотрим следующий подход:
Шаг за шагом:
источник
col.groupby((col != col.shift()).cumsum())
. примечание:groupby(by, ...)
здесьby
может быть dict или Series, когда передается dict или Series, Series или dict VALUES будут использоваться для определения групп.Вы должны использовать,
pandas.DataFrame.shift()
чтобы найти шаблон, который вам нужен.Код:
Тестовый код:
Результаты:
источник
Ответ @Stephen Rauch очень умный, но он медленный, когда я применил его к большому набору данных. Вдохновленный этим постом , я думаю, что у меня появился более эффективный способ достижения той же цели.
Код:
Результаты:
источник