如何将Pandas DataFrame转换为以唯一值为列标题的结构?
解决Pandas长格式转宽格式的分组透视问题
问题场景
现有如下结构的DataFrame:
import pandas as pd import numpy as np test = pd.DataFrame({ "a": ["zone 1", "zone 2", "code", "ID", np.nan, "zone 1", "zone 2", "code", "ID", "OBS"], "b": ["aaa", "bbb", 31, 10, np.nan, "ddd", "ggg", 23, 8, "NO INFO"] })
目标是将a列的值转为列标题,b列对应值作为数据内容,重复列名仅保留一个,最终得到两行数据的宽格式表。
问题原因
直接使用test.pivot(columns="a", values="b")无法得到预期结果,因为pivot默认以原索引为分组依据,每一行都会生成单独记录,导致结果中存在大量空值,无法按5行一组合并成两行数据。
解决方案
通过添加分组标识,将数据按固定行数分组后再执行透视操作:
# 生成分组标识:每5行划分为一组 test['group'] = test.index // 5 # 按分组透视,将a列转为表头,b列作为对应值 result = test.pivot(index='group', columns='a', values='b').reset_index(drop=True) # 把列名中的NaN替换为字符串'nan'(匹配期望结果格式) result.columns = result.columns.fillna('nan') print(result)
执行后输出结果:
zone 1 zone 2 code ID nan OBS 0 aaa bbb 31 10 NaN NaN 1 ddd ggg 23 8 NaN NO INFO
补充说明
- 如果每组行数不固定,但存在明确分隔标识(比如原始数据中的空行),可以用
test['a'].isna().cumsum()生成分组标识,自动识别每组边界。 - 使用
pivot时指定index参数是核心,它决定了哪些行会被合并到同一行结果中。
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

