如何基于pandas DataFrame的id1与Name列生成拆分汇总行并追加回原表
解决方案
你只需要调整聚合逻辑,在每个指定id分组下额外按Name列做二次聚合即可,不需要单独处理列表展开,完整代码如下:
import pandas as pd import numpy as np # 原始数据构造 d = {'id1': ['85643', '85644','8564312','8564314','85645','8564316','85646','8564318','85647','85648','85649','85655'], 'ID': ['G-00001', 'G-00001','G-00002','G-00002','G-00001','G-00002','G-00001','G-00002','G-00001','G-00001','G-00001','G-00001'], 'col1': [1, 2,3,4,5,60,0,0,6,3,2,4], 'Goal': [np.nan, 56,np.nan,89,73,np.nan ,np.nan ,np.nan, np.nan, np.nan, 34,np.nan ], 'col2': [3, 4,32,43,55,610,0,0,16,23,72,48], 'col3': [1, 22,33,44,55,60,1,5,6,3,2,4], 'Name': ['a1asd', 'a2asd','aabsd','aabsd','a3asd','aabsd','aasd','aabsd','aasd','aasd','aasd','aasd'], 'Date': ['2021-06-13', '2021-06-13','2021-06-13','2021-06-14','2021-06-15','2021-06-15','2021-06-13','2021-06-16','2021-06-13','2021-06-13','2021-06-13','2021-06-16']} dff = pd.DataFrame(data=d) # 指定id分组 b65 = ['85643','85645', '85655','85646'] b66 = ['85643','85645','85647','85648','85649','85644'] b67 = ['8564312','8564314','8564316','8564318'] d_map = {'b65': b65, 'b66': b66, 'b67': b67} # 定义聚合规则 agg_rules = {'col1': 'sum', 'col2': 'sum', 'col3': 'mean'} # 生成所有汇总行 sum_dfs = [] for group_id, id_list in d_map.items(): # 过滤当前id分组的行,按Name做聚合 tmp_df = dff[dff['id1'].isin(id_list)].groupby('Name', as_index=False).agg(agg_rules) # 给汇总行设置对应ID值 tmp_df['ID'] = group_id sum_dfs.append(tmp_df) sum_df = pd.concat(sum_dfs, ignore_index=True) # 拼接原表和汇总表 result = pd.concat([dff, sum_df], ignore_index=True) print(result)
逻辑说明
- 遍历每个自定义id分组,先筛选出符合id范围的所有行
- 对筛选后的行按
Name列分组,按照要求的规则做聚合,直接生成每个Name对应的单行汇总结果 - 给聚合后的行标记对应的自定义ID(b65/b66/b67)
- 所有汇总行拼接完成后,再和原表做纵向拼接,未定义的列(id1、Goal、Date)会自动填充NaN,完全符合预期输出要求。
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

