熊猫用值填充长度零

时间:2019-07-09 22:16:49

标签: python pandas dataframe

我有一个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。

但这看起来很复杂,我认为必须有更好的方法,例如使用滚动功能。

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