PythonPandascumsum与重置每次有0

ljsrvy3e  于 2022-12-02  发布在  Python
关注(0)|答案(4)|浏览(138)

我有一个0和1的矩阵,我想对每一列做一个累计,当看到一个0时,它就会重置为0。例如,我们有以下矩阵:

df = pd.DataFrame([[0,1],[1,1],[0,1],[1,0],[1,1],[0,1]],columns = ['a','b'])
print(df)
   a  b
0  0  1
1  1  1
2  0  1
3  1  0
4  1  1
5  0  1
    • 我想要的结果是:**
print(df)
   a  b
0  0  1
1  1  2
2  0  3
3  1  0
4  2  1
5  0  2

然而,当我尝试df.cumsum() * df时,我能够正确地识别0元素,但是计数器没有重置:

print(df.cumsum() * df)
   a  b
0  0  1
1  1  2
2  0  3
3  2  0
4  3  4
5  0  5
xwmevbvl

xwmevbvl1#

您可以用途:

a = df != 0
df1 = a.cumsum()-a.cumsum().where(~a).ffill().fillna(0).astype(int)
print (df1)
   a  b
0  0  1
1  1  2
2  0  3
3  1  0
4  2  1
5  0  2
yftpprvb

yftpprvb2#

试试这个

df = pd.DataFrame([[0,1],[1,1],[0,1],[1,0],[1,1],[0,1]],columns = ['a','b'])
df['groupId1']=df.a.eq(0).cumsum()
df['groupId2']=df.b.eq(0).cumsum()
New=pd.DataFrame()
New['a']=df.groupby('groupId1').a.transform('cumsum')
New['b']=df.groupby('groupId2').b.transform('cumsum')

New
Out[1184]: 
   a  b
0  0  1
1  1  2
2  0  3
3  1  0
4  2  1
5  0  2
pcrecxhr

pcrecxhr3#

您也可以尝试以下简单但可靠的方法。
按每列-创建要在其中计数的组。组在按行的顺序值差异出现时开始,并在值为常量时持续:(x != x.shift()).cumsum() .
示例:

a   b
0   1   1
1   2   1
2   3   1
3   4   2
4   4   3
5   5   3

使用pd.DataFrameapplygroupby方法计算每列组内的累积和,您将在一行中得到重置为零的累积和:

import pandas as pd

df = pd.DataFrame([[0,1],[1,1],[0,1],[1,0],[1,1],[0,1]], columns = ['a','b'])

cs = df.apply(lambda x: x.groupby((x != x.shift()).cumsum()).cumsum())
print(cs)

   a  b
0  0  1
1  1  2
2  0  3
3  1  0
4  2  1
5  0  2
h79rfbju

h79rfbju4#

一个稍微有点笨拙的方法是在执行cumsumcumsumcumsumcumsumcumsumcumsum

import pandas as pd
df = pd.DataFrame([[0,1],[1,1],[0,1],[1,0],[1,1],[0,1]],columns = ['a','b'])
z = np.where(df['b']==0)
df['b'][z[0]] = -z[0]
df['b'] = np.cumsum(df['b'])
df

   a  b
0  0  1
1  1  2
2  0  3
3  1  0
4  1  1
5  0  2

相关问题