使用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.
相关产品推荐
相关产品推荐

