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

使用Pandas(Python)实现行转列:企业年度报告分页数据的聚合需求

Pandas(Python)实现行转列:企业年度报告分页数据的聚合需求

嗨,我来帮你搞定这个分页数据聚合的问题!你需要把按页拆分的行数据,转成按企业-年度分组的列数据,Pandas里的pivot和pivot_table方法正好能完美解决这个需求,还能自动适配不同报告页数不一致的情况。

先重现你的原始数据

首先先把你给出的测试数据跑起来:

import pandas as pd

data = {
    'FIRM': ['A', 'A', 'B', 'B'],
    'YEAR': [2012, 2012, 2013, 2013],
    'Report Page': [1, 2, 1, 2],
    'Value1': [10, 15, 20, 25]
}

df = pd.DataFrame(data)

核心解决方案代码

直接用pivot就能实现你要的效果,步骤如下:

# 1. 执行行转列:按FIRM+YEAR分组,把Report Page转成列,对应Value1的值
pivoted_df = df.pivot(index=['FIRM', 'YEAR'], columns='Report Page', values='Value1')

# 2. 重命名列,改成你要的「Value1_PageX」格式
pivoted_df.columns = [f'Value1_Page{col}' for col in pivoted_df.columns]

# 3. 重置索引,把FIRM和YEAR从索引变回普通列
pivoted_df = pivoted_df.reset_index()

# 4. 可选:调整列名大小写,和你预期输出的Firm/Year匹配
pivoted_df.rename(columns={'FIRM': 'Firm', 'YEAR': 'Year'}, inplace=True)

print(pivoted_df)

执行后输出就是你想要的结果:

Firm  Year  Value1_Page1  Value1_Page2
0    A  2012            10            15
1    B  2013            20            25

关键步骤解释

  • pivot方法:指定index=['FIRM', 'YEAR']作为分组的唯一标识,columns='Report Page'表示把每页的编号转成列,values='Value1'表示列对应的数据来源。如果有的报告页数更多(比如3页),会自动生成Value1_Page3列,没有该页的企业年度会显示NaN,你可以用fillna(0)或者其他逻辑处理空值。
  • 列重命名:用列表推导式把原始列名(1、2...)改成带Page后缀的格式,完全符合你的命名要求。
  • 重置索引:pivot操作后,FIRM和YEAR会变成DataFrame的索引,reset_index()把它们变回普通列,和你预期的输出结构一致。

拓展场景处理

场景1:有多个Value列(比如Value1、Value2)

如果你的数据不止Value1一列,只需要稍微修改代码就能批量处理:

# 模拟多Value列的数据
data = {
    'FIRM': ['A', 'A', 'B', 'B'],
    'YEAR': [2012, 2012, 2013, 2013],
    'Report Page': [1, 2, 1, 2],
    'Value1': [10, 15, 20, 25],
    'Value2': [5, 7, 9, 11]
}
df = pd.DataFrame(data)

# 执行行转列,不指定values会自动处理所有数值列
pivoted_df = df.pivot(index=['FIRM', 'YEAR'], columns='Report Page')

# 重命名列,生成「ValueX_PageY」格式
pivoted_df.columns = [f'{col[0]}_Page{col[1]}' for col in pivoted_df.columns]

# 重置索引+调整列名
pivoted_df = pivoted_df.reset_index().rename(columns={'FIRM':'Firm', 'YEAR':'Year'})
print(pivoted_df)

场景2:存在重复的(FIRM,YEAR,Report Page)组合

如果同一家企业同一年的同一页有重复数据(比如多次录入),用pivot会报错,这时候改用pivot_table并指定聚合函数即可:

# 模拟有重复行的数据
data = {
    'FIRM': ['A', 'A', 'A', 'B', 'B'],
    'YEAR': [2012, 2012, 2012, 2013, 2013],
    'Report Page': [1, 1, 2, 1, 2],
    'Value1': [10, 12, 15, 20, 25]
}
df = pd.DataFrame(data)

# 用pivot_table聚合重复值,这里用均值,你也可以用sum/max等
pivoted_df = pd.pivot_table(
    df,
    index=['FIRM', 'YEAR'],
    columns='Report Page',
    values='Value1',
    aggfunc='mean'
)

# 后续步骤和之前一致
pivoted_df.columns = [f'Value1_Page{col}' for col in pivoted_df.columns]
pivoted_df = pivoted_df.reset_index().rename(columns={'FIRM':'Firm', 'YEAR':'Year'})
print(pivoted_df)

备注:内容来源于stack exchange,提问作者Mike M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 13:05:29