我有一个df,
import pandas as pd
col = 'one'
d = {col : pd.Series([1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1])}
df = pd.DataFrame(d)
df
df = 1,1,1,1,0,1,1,0,0,1,1
现在,我想将长度为x(此处x = 1)的所有连续值替换为值v(此处v = 1)。这样我的新df就是这样
1,1,1,1,<1>,1,1,0,0,1,1
代替
1,1,1,1,<0>,1,1,0,0,1,1
到目前为止,我的建议是建立连续的小组
def build_consecutive_groups(df: pd.DataFrame, col, newcol_appendix='_same'):
df[col + newcol_appendix] = (df[col] != df[col].shift()).cumsum()
return df.groupby(col + newcol_appendix, as_index=False)
添加另一列“ one_same”
1,1,1,1,2,3,3,4,4,5,5
这给了我亚组。现在,我可以使用子组的apply来获取形状并检查shape [0]为1且值为0来标识要替换为1的单元格。 然后创建一个标识这些值的索引系列,并在最后一步将它们设置为1。
但这看起来很复杂,我认为必须有更好的方法,例如使用滚动功能。
答案 0 :(得分:3)
您可以先使用diff
然后使用cumsum
,并使用groupby
+ transform
来使组替换值
x=1
s=df.one.diff().ne(0).cumsum()
df.loc[s.groupby(s).transform('count')==x,'one']='v'
df
Out[193]:
one
0 1
1 1
2 1
3 1
4 v
5 1
6 1
7 0
8 0
9 1
10 1