使用Python动态计算分组数据集的各列平均值
问题:按Objects分组计算各列平均值生成汇总表
我有一个行数数千但列数较少的大型数据集,已按Objects字段排序分组,数据集如下:
# Table1 import pandas as pd data = [['ALFA', 351740.00, 0.31, 0.22, 0.44, 0.19, 0.05], ['ALFA', 401740.00, 0.43, 0.26, 0.23, 0.16, 0.09], ['ALFA', 892350.00, 0.58, 0.24, 0.05, 0.07, 0.4], ['Bravo', 511830.00, 0.52, 0.16, 0.08, 0.26, 0], ['Charlie', 590030.00, 0.75, 0.2, 0.14, 0.37, 0.06], ['Charlie', 590030.00, 0.75, 0.2, 0.27, 0.2, 0.01], ['Charlie', 590030.00, 0.75, 0.2, 0.29, 0.11, 0.04], ['Charlie', 590030.00, 0.75, 0.2, 0.27, 0.2, 0.01], ['Charlie', 401740.00, 0.43, 0.26, 0.14, 0.37, 0.06], ['Charlie', 511830.00, 0.52, 0.16, 0.13, 0.22, 0.01], ['Delta', 590030.00, 0.75, 0.2, 0.34, 0.3, 0], ['Delta', 590030.00, 0.75, 0.2, 0, 0.28, 0], ['Delta', 351740.00, 0.31, 0.22, 0.44, 0.19, 0.05], ['Echo', 892350.00, 0.58, 0.24, 0.23, 0.16, 0.09], ['Echo', 590030.00, 0.75, 0.2, 0.05, 0.07, 0.4], ['Echo', 590030.00, 0.75, 0.2, 0.08, 0.26, 0], ['Echo', 590030.00, 0.75, 0.2, 0.14, 0.37, 0.06], ['Foxtrot', 401740.00, 0.43, 0.26, 0.27, 0.2, 0.01], ['Foxtrot', 511830.00, 0.52, 0.16, 0.29, 0.11, 0.04], ['Golf', 590030.00, 0.75, 0.2, 0.27, 0.2, 0.01], ['Golf', 590030.00, 0.75, 0.2, 0.14, 0.37, 0.06], ['Golf', 351740.00, 0.31, 0.22, 0.13, 0.22, 0.01], ['Hotel', 892350.00, 0.58, 0.24, 0.34, 0.3, 0], ['Hotel', 590030.00, 0.75, 0.2, 0, 0.28, 0], ['Hotel', 590030.00, 0.75, 0.2, 0.29, 0.11, 0.04]] df = pd.DataFrame(data, columns=['Objects', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6'])
需要按Objects字段分区,计算所有列的平均值,生成如下独立汇总表:
# Table2 data2 = [['ALFA', 548610.00, 0.44, 0.24, 0.24, 0.14, 0.18], ['Bravo', 511830.00, 0.52, 0.16, 0.08, 0.26, 0], ['Charlie', 545615.00, 0.66, 0.20, 0.21, 0.25, 0.03], ['Delta', 510600.00, 0.60, 0.21, 0.26, 0.26, 0.02], ['Echo', 665610.00, 0.71, 0.21, 0.13, 0.22, 0.14], ['Foxtrot', 456785.00, 0.48, 0.21, 0.28, 0.16, 0.03], ['Golf', 510600.00, 0.60, 0.21, 0.18, 0.26, 0.03], ['Hotel', 690803.33, 0.69, 0.21, 0.21, 0.23, 0.01]] df2 = pd.DataFrame(data2, columns=['Objects', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6'])
要求代码能自动适配数量不固定的Objects,自动统计每个Objects的行数并计算各列平均值。
解决方案
使用pandas的groupby方法按Objects分组,然后调用mean()计算各列平均值,最后按需调整小数精度即可:
import pandas as pd # 读取原始数据集 data = [['ALFA', 351740.00, 0.31, 0.22, 0.44, 0.19, 0.05], # 省略其余数据行 ['Hotel', 590030.00, 0.75, 0.2, 0.29, 0.11, 0.04]] df = pd.DataFrame(data, columns=['Objects', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6']) # 按Objects分组计算平均值,重置索引使Objects成为普通列 df_summary = df.groupby('Objects').mean().reset_index() # 调整各列的小数精度,匹配示例结果 df_summary['Column1'] = df_summary['Column1'].round(2) df_summary[['Column2', 'Column3', 'Column4', 'Column5']] = df_summary[['Column2', 'Column3', 'Column4', 'Column5']].round(2) df_summary['Column6'] = df_summary['Column6'].round(2) # 查看结果 print(df_summary)
代码说明
groupby('Objects').mean():自动按Objects分组,对每组的所有数值列计算平均值,无需手动统计行数(pandas会自动处理)。reset_index():将分组的Objects从索引转为普通列,符合示例表的结构。round()方法:根据示例结果调整各列的小数位数,确保输出格式一致。
内容的提问来源于stack exchange,提问作者Oshimiri Atata
相关产品推荐
相关产品推荐

