Python中如何用循环筛选DataFrame、执行计算并生成汇总新表
实现方案
你这个需求本质是按指定列分组后对每组执行自定义计算,最后合并结果,直接用pandas的groupby功能就能高效实现,不需要手动逐个筛选索引值。
标准方案(推荐)
1. 准备数据
import pandas as pd import numpy as np # 构造和示例结构一致的测试数据,如果你已有数据可跳过这步 df = pd.DataFrame({ 'id': [1,1,1,2,2,2,3,3,3], 'col1': [10,20,30,15,25,35,12,22,32], 'col2': [4,5,6,7,8,9,1,2,3] }) # 如果你说的索引列是DataFrame默认行索引,先转成普通列再分组 # df = df.reset_index(names='id')
2. 定义分组计算逻辑
你可以把任意要对单组执行的计算逻辑写在函数里:
def custom_calc(group_df): # 下方为示例计算逻辑,可替换为你自己的规则 return pd.Series({ 'id': group_df['id'].iloc[0], 'col1_sum': group_df['col1'].sum(), 'col2_avg': group_df['col2'].mean(), 'custom_metric': group_df['col1'].max() * group_df['col2'].min() })
3. 分组计算得到汇总表
summary_df = df.groupby('id', as_index=False).apply(custom_calc, include_groups=False).reset_index(drop=True)
手动循环实现(不推荐,仅做参考)
如果确实需要手动控制筛选流程,也可以遍历所有唯一索引值实现:
unique_ids = df['id'].unique() res_list = [] for id_val in unique_ids: # 筛选当前索引值对应的行 sub_df = df[df['id'] == id_val] # 执行自定义计算 res = { 'id': id_val, 'col1_sum': sub_df['col1'].sum(), 'col2_avg': sub_df['col2'].mean() } res_list.append(res) # 合并结果为汇总表 summary_df = pd.DataFrame(res_list)
注意事项
- 如果要对分组做更复杂的操作比如整组变换、按规则过滤分组,
groupby也支持transform、filter方法,按需调用即可 include_groups=False是pandas 2.2及以上版本的参数,如果你用的是更早的版本,删除该参数即可,不会影响计算结果
内容的提问来源于stack exchange,提问作者Igor Reis
相关产品推荐
相关产品推荐

