Python pandas不同大小DataFrame按行业分组聚合实现方法
实现方案
核心逻辑:先将宽格式存储的股价表转换为「年份-公司-股价」的长表结构,关联公司对应的行业属性后,按年份+行业维度分组求和,最后转换回以年份为行、行业为列的目标宽表结构即可。
步骤1:导入依赖、构造示例测试数据
和描述的样例数据结构完全对齐,可直接替换为本地的真实DataFrame:
import pandas as pd # 股票历史价格数据集(宽表:每列对应一家公司股价) price_df = pd.DataFrame({ 'year': [1980, 1981], 'Company1': [4.66, 5.68], 'Company2': [12.32, 15.53] }) # 公司属性映射数据集 company_info_df = pd.DataFrame({ '公司名称': ['Company1', 'Company2', 'Company3'], '所属行业': ['industrials', 'consumer goods', 'industrials'], '所属国家': ['Germany', 'US', 'France'] })
步骤2:宽表转长表,关联公司行业属性
将每家公司单独成列的股价数据转换为行记录,匹配对应公司的行业标签:
# 宽表转长表,每一行对应单一年份单家公司的股价 price_long = price_df.melt( id_vars='year', var_name='公司名称', value_name='股价' ) # 关联行业信息,仅保留存在股价记录的公司 merged_df = price_long.merge( company_info_df[['公司名称', '所属行业']], on='公司名称', how='left' ) # 可选:过滤掉属性表中无匹配行业的无效公司记录 merged_df = merged_df.dropna(subset=['所属行业'])
步骤3:分组聚合后转回目标宽表
按年份和行业分组求和,再转换为行是年份、列是行业的结构,同时补全无对应公司的行业列(比如示例中的healthcare):
# 按年份+行业分组,计算对应行业年度股价总和 industry_agg = merged_df.groupby(['year', '所属行业'], as_index=False)['股价'].sum() # 透视转换为目标宽表格式 result_df = industry_agg.pivot( index='year', columns='所属行业', values='股价' ).reset_index().fillna(0) # 补全需要展示但当前无数据的行业列,固定输出列顺序 target_columns = ['year', 'industrials', 'consumer goods', 'healthcare'] for col in target_columns: if col not in result_df.columns: result_df[col] = 0 result_df = result_df[target_columns]
注意事项
- 最终输出
result_df的结构和目标格式完全一致:行维度为年份,列维度为各行业分类,单元格为对应年份该行业所有纳入统计公司的股价总价值 - 如果后续新增行业分类,只需要修改
target_columns列表,新增对应行业名即可自动补全列,无数据的年份默认填充0 - 属性表中存在、但股价表无交易记录的公司会被自动过滤,不会计入行业总和
内容的提问来源于stack exchange,提问作者Sam333
相关产品推荐
相关产品推荐

