Pandas:满足双条件的分组内累计求和实现方案
解决方案:按分组实现条件累计求和
你完全找对方向了,groupby()正是实现这个需求的核心方法!我们可以结合条件判断和分组累计求和来完美匹配你的需求,下面是具体的实现步骤和代码:
1. 准备示例数据
首先我们先构造你提供的DataFrame:
import pandas as pd data = { 'index': [0, 1, 2, 3, 4, 5], 'x': [0.1, 1.2, 0.25, 1.0, 0.72, 1.5], 'y': [1, 1, 1, 2, 2, 2], 'value_1': [12, 10, 7, 3, 5, 10] } df = pd.DataFrame(data).set_index('index')
2. 实现分组条件累计求和
我们可以使用groupby('y')对每组单独处理,结合where()方法筛选符合条件的value_1值,再用cumsum()计算累计和:
# 计算cumsum_1:仅x<1时累计value_1,否则计入0,分组累计 df['cumsum_1'] = df.groupby('y').apply( lambda group: group['value_1'].where(group['x'] < 1, 0).cumsum() ).reset_index(level=0, drop=True) # 计算cumsum_2:仅x>1时累计value_1,否则计入0,分组累计 df['cumsum_2'] = df.groupby('y').apply( lambda group: group['value_1'].where(group['x'] > 1, 0).cumsum() ).reset_index(level=0, drop=True)
代码说明:
groupby('y'):按y列的分组标识进行分组,每个分组独立计算累计和,分组变化时自动重置累计状态。where(group['x'] < 1, 0):仅保留x<1对应的value_1值,其余情况替换为0,这样累计时只会累加符合条件的数值。cumsum():对每个分组内的筛选后的值计算累计和。reset_index(level=0, drop=True):去掉分组产生的额外索引,让结果能正确匹配原DataFrame的每行数据。
3. 调整适配示例结果
观察你提供的示例,行3(x=1.0)的cumsum_2为3,说明你可能需要将x=1的情况计入cumsum_2。只需把cumsum_2的条件改为group['x'] >= 1即可:
df['cumsum_2'] = df.groupby('y').apply( lambda group: group['value_1'].where(group['x'] >= 1, 0).cumsum() ).reset_index(level=0, drop=True)
调整后得到的结果就和你给出的示例完全一致了:
x y value_1 cumsum_1 cumsum_2 index 0 0.10 1 12 12 0 1 1.20 1 10 12 10 2 0.25 1 7 19 10 3 1.00 2 3 0 3 4 0.72 2 5 5 3 5 1.50 2 10 5 13
内容的提问来源于stack exchange,提问作者Horst-Jackson
相关产品推荐
相关产品推荐

