如何对数据框的多列应用累计计数

时间:2018-10-15 08:40:26

标签: 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

我正在尝试对数据帧的多列应用累积计数cumcount,我已经尝试通过对每列进行分组来应用累积计数。有什么简单的方法可以达到预期的输出结果

我已经尝试过此代码,但是无法正常工作

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

预期产量

    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

1 个答案:

答案 0 :(得分: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

如果性能很重要的另一种解决方案-仅计算1个值,最后用1的掩码设置np.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