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

如何使用Pandas将列值与现有列转换为多级列?

嘿,我完全get到你想要的这种多级表头转换需求了!不用纠结iterrows那种低效的方法,用pivot配合几步层级调整就能完美解决,咱们一步步来:

首先,先确认下你的原始DataFrame结构(我猜你可能排版时列和行对应有点小问题,先把正确的示例数据构造出来方便复现):

import pandas as pd

data = {
    'date': ['20000103', '20000104', '20000105', '20000106',
             '20000103', '20000104', '20000105', '20000106'],
    'ticker': ['company1', 'company1', 'company1', 'company1',
               'company2', 'company2', 'company2', 'company2'],
    'PX_LAST': [1234, 2345, 3465, 4567, 1, 2, 3, 4],
    'PX_OPEN': [6543, 7654, 8765, 9876, 6, 7, 8, 9]
}
df = pd.DataFrame(data)

接下来是核心步骤,每一步都很清晰:

  1. 透视生成基础多级列结构
    用pivot把ticker转成列的一个层级,同时按date分组:

    pivoted = df.pivot(index='date', columns='ticker', values=['PX_LAST', 'PX_OPEN'])
    

    这时候生成的列层级是[字段, 公司],但我们需要的是[公司, 字段],所以下一步调整层级。

  2. 交换列层级并排序
    用swaplevel交换列的两个层级,再排序让同一公司的字段挨在一起:

    pivoted = pivoted.swaplevel(axis=1).sort_index(axis=1)
    
  3. 调整表头和列结构
    把date索引转成普通列,然后给这个列设置和其他列匹配的多级表头:

    pivoted = pivoted.reset_index()
    # 重新构造多级列名,把date列命名为('ticker', 'field')
    pivoted.columns = pd.MultiIndex.from_tuples(
        [('ticker', 'field')] + list(pivoted.columns[1:])
    )
    
  4. 输出最终格式
    如果不想显示行索引,直接用to_string(index=False)打印:

    print(pivoted.to_string(index=False))
    

最终输出的结果完全符合你的需求:

ticker company1        company2        
  field   PX_LAST PX_OPEN PX_LAST PX_OPEN
20000103     1234    6543       1       6
20000104     2345    7654       2       7
20000105     3465    8765       3       8
20000106     4567    9876       4       9

整个过程都是pandas的矢量化操作,效率比iterrows高太多,代码也清晰易读~

内容的提问来源于stack exchange,提问作者displayname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:02:59