如何在多列数据帧上应用累积计数

Nag*_*ran 1 python pandas

数据帧

    a   b   c
0   0   1   1
1   0   1   1
2   0   0   1
3   0   0   1
4   1   1   0
5   1   1   1
6   1   1   1
7   0   0   1
Run Code Online (Sandbox Code Playgroud)

我正在尝试cumcount在数据帧的多列上应用累积计数,我尝试通过对每列进行分组来应用累计计数.有没有简单的方法来实现预期的产出

我试过这段代码,但它没有用

li =[]
for column in df.columns:
    li.append(df.groupby(column)[column].cumcount())
pd.concat(li,axis=1)
Run Code Online (Sandbox Code Playgroud)

预期产出

    a   b   c
0   1   1   1
1   1   2   2
2   1   1   3
3   1   1   4
4   1   1   1
5   2   2   1
6   3   3   2
7   1   1   3
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

通过与移位值进行比较来创建连续组,并为每个列应用cumcount,最后1通过布尔掩码设置:

df = (df.ne(df.shift()).cumsum()
       .apply(lambda x: df.groupby(x).cumcount() + 1)
       .mask(df == 0, 1))
print (df)
   a  b  c
0  1  1  1
1  1  2  2
2  1  1  3
3  1  1  4
4  1  1  1
5  2  2  1
6  3  3  2
7  1  1  3
Run Code Online (Sandbox Code Playgroud)

如果性能很重要的另一个解决方案 - 只计算掩码中的1值和最后设置:1np.where

a = df == 1
b = a.cumsum()
arr = np.where(a, b-b.mask(a).ffill().fillna(0).astype(int), 1)

df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
   a  b  c
0  1  1  1
1  1  2  2
2  1  1  3
3  1  1  4
4  1  1  1
5  2  2  1
6  3  3  2
7  1  1  3
Run Code Online (Sandbox Code Playgroud)