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

如何将Pandas列值转为新列?DataFrame结构转换技术咨询

解决Pandas DataFrame长转宽:保留指定列并消除分层索引

我明白你的问题啦!这种长格式转宽格式的需求在Pandas里很常见,你遇到的分层列索引和保留指定列的问题,其实只要调整一下参数就能解决。先给你举个具体的例子,你可以对应自己的DataFrame来参考:

示例数据

假设你的原始长格式DataFrame是这样的:

import pandas as pd

df_long = pd.DataFrame({
    'a': ['x', 'x', 'y', 'y'],
    'b': ['m', 'n', 'm', 'n'],
    'c': ['col1', 'col2', 'col1', 'col2'],
    'd': [10, 20, 30, 40]
})

你想要转换成的目标宽格式结构是:

df_wide = pd.DataFrame({
    'a': ['x', 'y'],
    'b': ['m', 'm'],
    'col1': [10, 30],
    'col2': [20, 40]
})

方法一:使用pivot_table

你之前尝试过pivot_table但不知道怎么保留a、b列,其实只要把这两列设为index参数,再指定columns为生成新列的c列,最后重置索引并清理列名即可:

df_result = df_long.pivot_table(
    index=['a', 'b'],  # 要保留的列作为索引
    columns='c',       # 用来生成新列的列
    values='d',        # 对应新列的值
    aggfunc='first'    # 如果有重复的a/b/c组合,这里选合适的聚合函数,比如sum/mean
).reset_index()

# 消除分层列索引,去掉columns的名称
df_result.columns.name = None

这样处理后,a和b就变回普通列,c的不同取值成为新的列,完全符合目标结构。

方法二:使用groupby + unstack

如果你想用groupby和unstack组合,只需要在unstack后重置索引,并清理列名就能解决分层索引的问题:

# 按a、b、c分组,取出对应的值后unstack c列
df_result = df_long.groupby(['a', 'b', 'c'])['d'].first().unstack('c').reset_index()

# 去掉列的分层名称
df_result.columns.name = None

注意事项

如果你的数据中存在重复的a/b/c组合,一定要根据实际需求选择合适的聚合函数(比如sum、mean、max等),避免数据丢失或错误聚合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:29:28