You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:57