如何用Pandas将多列数据从长格式转宽格式?尝试多种方法未果
问题:DataFrame长格式转宽格式未得到预期结果
原始DataFrame
| foo | bar | tar |
|---|---|---|
| one | A | AA |
| one | NaN | BB |
| two | C | NaN |
期望输出的DataFrame
| foo | A | B | C | AA | BB | CC |
|---|---|---|---|---|---|---|
| one | bar | NaN | NaN | tar | tar | tar |
| two | NaN | NaN | bar | tar | tar | NaN |
已尝试的代码
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
相关产品推荐
相关产品推荐

