以Python/Pandas表示的条件累计和

2022-03-07 00:00:00 python-3.x pandas dataframe ipython

问题描述

考虑我的数据帧,df

data  data_binary  sum_data
  2       1            1
  5       0            0
  1       1            1
  4       1            2
  3       1            3
  10      0            0
  7       0            0
  3       1            1

如何计算连续1值组内的data_binary的累计和?

第一组1有一个1sum_data只有一个1。但是,第二组1有3个,sum_data[1, 2, 3]

我已尝试使用np.where(df['data_binary'] == 1, df['data_binary'].cumsum(), 0),但返回

array([1, 0, 2, 3, 4, 0, 0, 5])

这不是我想要的。


解决方案

您要将data_binary的累计和减去最近的累计和,其中data_binary是零。

b = df.data_binary
c = b.cumsum()
c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int)

输出

0    1
1    0
2    1
3    2
4    3
5    0
6    0
7    1
Name: data_binary, dtype: int64

说明

让我们从并排看每一步开始

cols = ['data_binary', 'cumulative_sum', 'nan_non_zero', 'forward_fill', 'final_result']
print(pd.concat([
        b, c,
        c.mask(b != 0),
        c.mask(b != 0).ffill(),
        c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int)
    ], axis=1, keys=cols))

输出

data_binary  cumulative_sum  nan_non_zero  forward_fill  final_result
0            1               1             NaN           NaN             1
1            0               1             1.0           1.0             0
2            1               2             NaN           1.0             1
3            1               3             NaN           1.0             2
4            1               4             NaN           1.0             3
5            0               4             4.0           4.0             0
6            0               4             4.0           4.0             0
7            1               5             NaN           4.0             1
cumulative_sum的问题在于data_binary为零的行不重置总和。这就是这个解决方案的动机。当data_binary总和为零时如何重置(&Q;)?放松点!我对data_binary为零的累积和进行切片,然后向前填充值。当我取此和累计总和之间的差值时,我实际上已经重置了总和。

相关文章