给定一个包含“group”列、“value”列和"threshold“列的DataFrame,我需要对每个”group“中的”value“执行累积求和。
但是,每次超过为组指定的“阈值”时,累积总和都应重置。每个组的“阈值”可能不同。
下面是一个示例DataFrame:
import pandas as pd
data = {
'group': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
'value': [10, 20, 30, 40, 10, 20, 30, 40, 50],
'threshold': [50, 50, 50, 50, 70, 70, 70, 100, 100]
}
df = pd.DataFrame(data)
group value threshold
0 A 10 50
1 A 20 50
2 A 30 50
3 A 40 50
4 B 10 70
5 B 20 70
6 B 30 70
7 C 40 100
8 C 50 100
expected_df
group value threshold cumsum_reset
0 A 10 50 10
1 A 20 50 30
2 A 30 50 30
3 A 40 50 40
4 B 10 70 10
5 B 20 70 30
6 B 30 70 60
7 C 40 100 40
8 C 50 100 90
字符串
预期的输出应该向DataFrame添加一个新列“cumsum_reset”,显示在超过阈值后重置的累积和。
有人能提出一种有效的方法来在pandas中做到这一点,而不显式地迭代每行吗?
3条答案
按热度按时间hsgswve41#
尝试使用
groupby
和apply
与自定义函数:字符串
输出:
型
irtuqstp2#
我建议使用numba来加速计算,例如:
字符串
打印:
型
vjhs03f73#
两件事:
apply
是very slow and should be avoided whenever possible。这在这里是可能的。Groupby
在处理新组时自然会导致cumsum
的重置。因此,这只是一个分组问题,不仅是通过'group'
,而且还通过超过阈值。下面是一个不使用
apply
的方法:字符串
最后删除临时列:
型
所有这些都可以总结在这个等效的一行代码中:
型