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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:05:10