如何用Pandas将分组均值转换为含全局统计的目标矩阵?
我明白你想要构建一个包含“全部”汇总行和列的矩阵,其中0行对应所有code的汇总均值,0列对应所有y_m的汇总均值,交叉点是全局总均值,其余位置是对应(code,y_m)的分组均值,缺失的组合用-1占位。用pivot_table确实很难直接一步到位生成这种带多层汇总的结构,不过我们可以分步骤手动构建这个矩阵,下面是具体实现方法:
步骤1:计算各个层级的汇总均值
首先我们需要先算出全局总均值、按y_m分组的均值、按code分组的均值,这些是填充“全部”行和列需要的数据:
import pandas as pd import numpy as np # 先构造示例数据(方便测试) data = { 'code': [1000,1000,1000,1000,2000,2000,2000,2000,2000], 'y_m': [201701,201701,201702,201702,201701,201701,201702,201702,201702], 'date1': pd.to_datetime(['2017-12-10','2017-12-14','2017-12-15','2017-12-17','2017-12-19','2017-12-12','2017-12-11','2017-12-13','2017-12-11']), 'date2': pd.to_datetime(['2017-12-09','2017-12-12','2017-12-13','2017-12-15','2017-12-18','2017-12-10','2017-12-10','2017-12-12','2017-12-10']), 'period': [1,2,2,2,1,2,1,1,1] } df = pd.DataFrame(data) # 计算分组均值(你已经完成的步骤) df_avg_period = df.groupby(['code', 'y_m'])['period'].mean().reset_index(name='avg_period') # 计算全局总均值 global_mean = df['period'].mean() # 按y_m分组的均值 y_m_means = df.groupby('y_m')['period'].mean() # 按code分组的均值 code_means = df.groupby('code')['period'].mean()
步骤2:初始化带“全部”行和列的矩阵
我们创建一个以[0] + 所有code值为行索引,[0] + 所有y_m值为列索引的空矩阵,并用-1填充占位:
# 准备行和列标签:0代表“全部” rows = [0] + df['code'].unique().tolist() cols = [0] + df['y_m'].unique().tolist() # 初始化矩阵,填充-1作为占位符 result_matrix = pd.DataFrame(-1, index=rows, columns=cols)
步骤3:填充各个位置的均值
接下来我们把之前计算的各类均值填充到对应的位置:
# 填充0行0列:全局总均值 result_matrix.loc[0, 0] = global_mean # 填充0行的各个y_m列:对应y_m的总均值 for y_m in cols[1:]: result_matrix.loc[0, y_m] = y_m_means[y_m] # 填充各个code行的0列:对应code的总均值 for code in rows[1:]: result_matrix.loc[code, 0] = code_means[code] # 填充各个(code,y_m)组合的分组均值 for _, row in df_avg_period.iterrows(): code = row['code'] y_m = row['y_m'] result_matrix.loc[code, y_m] = row['avg_period']
最终结果
运行完上面的代码后,你会得到如下结构的矩阵:
0 201701 201702 0 1.4444 1.500 1.40 1000 1.7500 1.500 2.00 2000 1.2000 1.500 1.00
这个矩阵完全符合你的需求:
- 0行0列是所有
period的全局均值 - 0行的其他列是对应
y_m下所有period的均值 - 0列的其他行是对应
code下所有period的均值 - 其余位置是
code和y_m分组后的均值 - 如果有某个(code,y_m)组合不存在数据,对应的位置会保留-1作为占位符
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

