首页 > 解决方案 > Python pandas cumsum 在另一列中按值重置

问题描述

我有几个模拟的成功/失败数据。每个模拟都包含几个试验,我想要每个模拟成功的累积总和。这是我的数据示例:

data = pd.DataFrame([[0, 0, 0],
                     [0, 1, 0],
                     [0, 2, 1],
                     [0, 3, 0],
                     [1, 0, 1],
                     [1, 1, 0],
                     [1, 2, 0],
                     [1, 3, 1],
                     [2, 0, 0],
                     [2, 1, 1],
                     [2, 2, 1],
                     [2, 3, 1],
                     [0, 0, 0],
                     [0, 1, 1],
                     [0, 2, 1],
                     [0, 3, 0]],
                   columns=['simulation', 'trial', 'success'])

使用这个答案,我想出了以下代码,但它不是很有效,我不知道为什么。

cumsum = data['success'].cumsum()
reset = -cumsum[data['trial'] == 0].diff().fillna(cumsum)
data['cumsum'] = data['success'].where(data['trial'] != 0, reset).cumsum()

结果列是[0, 0, 1, 1, -1, -1, -1, 0, -1, 0, 1, 2, -1, 0, 1, 1],但我期望[0, 0, 1, 1, 1, 1, 1, 2, 0, 1, 2, 3, 0, 1, 2, 2]

标签: pythonpandas

解决方案


您可以进行groupby '模拟' & 然后cumsum '成功'。

data.groupby(data.simulation.ne(data.simulation.shift()).cumsum())['success'].cumsum()

或者

data.groupby((data.simulation!=data.simulation.shift()).cumsum())['success'].cumsum()

推荐阅读