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

如何将含重复行与分类变量的Pandas长表转换为指定格式宽表?

解决长格式DataFrame转指定宽格式的问题

给定的长格式DataFrame如下:

import pandas as pd

df = pd.DataFrame({
    'ID': {0: 101, 1: 101, 2: 101, 3: 102, 4: 102, 5: 102, 6: 102, 7: 102, 8: 103, 9: 103},
    'Category': {0: 'A', 1: 'B', 2: 'C', 3: 'A', 4: 'A', 5: 'A', 6: 'B', 7: 'B', 8: 'A', 9: 'B'}
})

要将其转换为以Role1到Role5为列的宽格式,每个ID对应的Category按顺序填充,不足的用NaN补全,可以按以下步骤操作:

  1. 为每个ID分组内的行添加序号,用于生成Role列名
# 按ID分组,给每组内的行分配从1开始的序号
df['role_num'] = df.groupby('ID').cumcount() + 1
  1. 转换为宽格式并重命名列
# 转宽格式,ID作为索引,序号作为列,Category作为值
wide_df = df.pivot(index='ID', columns='role_num', values='Category')
# 将列名改为Role1、Role2...格式
wide_df.columns = [f'Role{col}' for col in wide_df.columns]
# 重置索引,让ID变回普通列
wide_df = wide_df.reset_index()
  1. 补全到5列,缺失列填充NaN
# 生成需要的Role1到Role5列名列表
required_cols = ['ID'] + [f'Role{i}' for i in range(1, 6)]
# 重新索引,自动为缺失列填充NaN
wide_df = wide_df.reindex(columns=required_cols, fill_value=pd.NA)

最终输出结果:

ID Role1 Role2 Role3 Role4 Role5
0  101     A     B     C  <NA>  <NA>
1  102     A     A     A     B     B
2  103     A     B  <NA>  <NA>  <NA>

如果需要显示NaN而非<NA>,可将最后一步的fill_value改为np.nan(需提前导入import numpy as np)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:36:27