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

如何用Pandas将多列数据从长格式转宽格式?尝试多种方法未果

问题:DataFrame长格式转宽格式未得到预期结果

原始DataFrame

foobartar
oneAAA
oneNaNBB
twoCNaN

期望输出的DataFrame

fooABCAABBCC
onebarNaNNaNtartartar
twoNaNNaNbartartarNaN

已尝试的代码

pd.DataFrame(df.stack()).T.reset_index()

df.pivot(index='foo',columns='bar').reset_index()

数据初始化代码

import numpy as np
import pandas as pd

foo = ['one','one','two']
bar = ['A',np.NaN,'C']
tar = ['AA','BB', np.NaN]

df = {'foo':foo,'bar':bar,'tar':tar}
df = pd.DataFrame(df)
解决方案

要实现目标格式,需要先将原始数据重塑为类型-值的长格式,再通过透视生成宽表,具体步骤如下:

1. 重塑数据结构

把bar和tar列拆分为"类型(bar/tar)"和"对应值"的配对,同时剔除空值:

# 转换为长格式:保留foo作为标识列,将bar、tar转为类型和值
melted_df = df.melt(id_vars='foo', var_name='type', value_name='value').dropna(subset=['value'])

2. 透视生成宽表

以foo为索引,value为列名,type为填充值,再补充期望中存在但原始数据没有的列(B、CC):

# 透视得到基础宽表
pivoted_df = melted_df.pivot(index='foo', columns='value', values='type').reset_index()

# 对齐目标列顺序并补充缺失列
target_columns = ['foo', 'A', 'B', 'C', 'AA', 'BB', 'CC']
final_df = pivoted_df.reindex(columns=target_columns)

3. 最终结果

执行后final_df的输出为:

foo    A    B    C   AA   BB   CC
0  one  bar  NaN  NaN  tar  tar  NaN
1  two  NaN  NaN  bar  NaN  NaN  NaN

(注:原始数据中two的tar为空值,因此期望中two行的AA、BB列显示tar不符合数据逻辑,上述结果为基于原始数据的正确输出)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:11:40