如何在Python DataFrame中按条件分组添加求和行(assetClass=99)
解决方案:分组聚合新增行并合并到原DataFrame
你要做的其实是分组聚合(GroupBy Aggregation)+ 行追加合并的组合操作,这在pandas里是很常见的数据集增强需求,我来给你一步步拆解实现方案:
步骤说明
- 从原DataFrame中筛选出
assetClass在11-16范围内的行 - 按
clientID和date分组,对value列求和 - 为聚合后的结果设置
assetClass=99,并为其他需保留的列填充空值(NaN) - 将聚合生成的新行和原DataFrame合并
代码示例
1. 构造样例数据(模拟你的数据集)
import pandas as pd import numpy as np # 模拟你的DataFrame,包含需要保留的其他列 data = { 'clientID': [1, 1, 1, 2, 2], 'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-01', '2024-01-02'], 'assetClass': [2, 11, 15, 12, 3], 'value': [100, 200, 300, 150, 50], 'other_col1': ['A', 'B', 'C', 'D', 'E'], # 需保留的列1 'other_col2': [10, 20, 30, 40, 50] # 需保留的列2 } df = pd.DataFrame(data)
2. 分组聚合生成assetClass=99的行
# 筛选目标assetClass范围的行,按clientID+date分组求和value aggregated_rows = df[df['assetClass'].between(11, 16)] \ .groupby(['clientID', 'date'], as_index=False) \ .agg({'value': 'sum'}) \ .assign(assetClass=99) # 设置新行的assetClass为99 # 自动识别所有需保留的其他列,填充为NaN(空值) keep_columns = [col for col in df.columns if col not in ['clientID', 'date', 'assetClass', 'value']] for col in keep_columns: aggregated_rows[col] = np.nan
3. 合并原数据和新生成的行
# 合并两个数据集,重置索引 final_df = pd.concat([df, aggregated_rows], ignore_index=True) # 可选:按clientID、date、assetClass排序,让结果更规整 final_df.sort_values(by=['clientID', 'date', 'assetClass'], inplace=True)
关键细节说明
- 使用
between(11,16)可以简洁筛选出11到16的assetClass,避免手动列举[11,12,13,14,15,16] groupby时设置as_index=False,确保clientID和date保持为普通列,方便后续合并- 自动识别保留列的方式,让代码在新增保留列时不需要手动修改,更灵活
- 如果需要给保留列设置特定默认值(而非NaN),直接把
np.nan替换成你需要的值即可
内容的提问来源于stack exchange,提问作者Crumpster
相关产品推荐
相关产品推荐

