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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:03:23