如何使用Pandas API实现DataFrame分组列的行转多行合并?
Pandas 拆分多组业务数据为独立行的简便实现
针对你提到的每行包含ticker字段及两组各3列业务数据的DataFrame,无需手动创建两个子DataFrame再拼接,Pandas提供了更简洁的API完成宽表到长表的转换,推荐两种方案:
方案1:使用wide_to_long(推荐,适配多组重复结构)
假设原始DataFrame列名格式为ticker、group1_col1、group1_col2、group1_col3、group2_col1、group2_col2、group2_col3,可直接用wide_to_long处理:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ticker': ['AAPL', 'MSFT'], 'group1_col1': [10, 20], 'group1_col2': [11, 21], 'group1_col3': [12, 22], 'group2_col1': [30, 40], 'group2_col2': [31, 41], 'group2_col3': [32, 42] }) # 调用wide_to_long拆分 result = pd.wide_to_long( df, stubnames=['group1', 'group2'], # 两组数据的前缀 i='ticker', # 保留的主键列 j='col_suffix', # 拆分后新增的列名(对应原列的后缀,如col1/col2/col3) sep='_', # 列名中前缀和后缀的分隔符 suffix=r'\w+' # 匹配后缀的正则 ).stack().reset_index() # 整理列名到目标格式 result.columns = ['ticker', 'col_name', 'group', 'value'] # 若不需要col_name列,可直接删除:result = result.drop('col_name', axis=1)
方案2:使用melt+列名拆分
如果列名格式不固定,用melt先将所有业务列转成行,再拆分列名区分组别:
# 第一步:melt转换所有业务列为行 melted_df = df.melt(id_vars='ticker', var_name='group_col', value_name='value') # 第二步:拆分group_col列,提取组别和业务列名 melted_df[['group', 'col']] = melted_df['group_col'].str.split('_', expand=True, n=1) # 第三步:重新整理成目标结构(按ticker和group分组,恢复业务列) final_df = melted_df.pivot( index=['ticker', 'group'], columns='col', values='value' ).reset_index() final_df.columns.name = None
这两种方法都避免了手动拼接的冗余代码,尤其是wide_to_long完全适配这种多组重复结构的宽表转换,代码更简洁且性能更优。
内容的提问来源于stack exchange,提问作者CrazyC
相关产品推荐
相关产品推荐

