Pandas数据帧除了最后的零值之外的列的累积和

时间:2018-01-26 15:02:42

标签: python pandas

我想在一个pandas数据帧上做累积求和而不将总和转移到最后的零值。例如,给出一个数据帧:

   A   B
1  1   2
2  5   0
3  10  0
4  10  1
5  0   1
6  5   2
7  0   0
8  0   0
9  0   0

指数1到6的累积总和:

   A   B
1  1   2
2  6   2
3  16  2
4  26  3
5  26  4
6  31  6
7  0   0
8  0   0
9  0   0

4 个答案:

答案 0 :(得分:1)

如果不想在所有列中使用0表示最后0个值:

比较行号是否包含a = df.ne(0).any(1).shift().cumsum() m = a != a.max() df[m] = df[m].cumsum() print (df) A B 1 1 2 2 6 2 3 16 2 4 26 3 5 26 4 6 31 6 7 0 0 8 0 0 9 0 0 ,移位掩码并使用累计和。最后与上一个值和过滤器进行比较:

any

类似的解决方案,如果想分别处理每一列 - 只省略print (df) A B 1 1 2 2 5 0 3 10 0 4 10 1 5 0 1 6 5 0 7 0 0 8 0 0 9 0 0 a = df.ne(0).shift().cumsum() m = a != a.max() df[m] = df[m].cumsum() print (df) A B 1 1 2 2 6 2 3 16 2 4 26 3 5 26 4 6 31 0 7 0 0 8 0 0 9 0 0

{{1}}

答案 1 :(得分:1)

使用

In [262]: s = df.ne(0).all(1)

In [263]: l = s[s].index[-1]

In [264]: df[:l] = df.cumsum()

In [265]: df
Out[265]:
    A  B
1   1  2
2   6  2
3  16  2
4  26  3
5  26  4
6  31  6
7   0  0
8   0  0
9   0  0

答案 2 :(得分:0)

我将使用last_valid_index

v=df.replace(0,np.nan).apply(lambda x : x.last_valid_index())


df[pd.DataFrame(df.index.values<=v.values[:,None],columns=df.index,index=df.columns).T].cumsum().fillna(0)


Out[890]: 
      A    B
1   1.0  2.0
2   6.0  2.0
3  16.0  2.0
4  26.0  3.0
5  26.0  4.0
6  31.0  6.0
7   0.0  0.0
8   0.0  0.0
9   0.0  0.0

答案 3 :(得分:0)

要跳过第一个0, 0行之后的所有行,请使用idxmax(0)

获取df['A']df[B]为0的第一个索引(按行)
>>> m = ((df["A"]==0) & (df["B"]==0)).idxmax(0)
>>> df[:m] = df[:m].cumsum()
>>> df
    A  B
0   1  2
1   6  2
2  16  2
3  26  3
4  26  4
5  31  6
6   0  0
7   0  0
8   0  0