数据帧
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)
通过与移位值进行比较来创建连续组,并为每个列应用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)