如何将含重复行与分类变量的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补全,可以按以下步骤操作:
- 为每个ID分组内的行添加序号,用于生成Role列名
# 按ID分组,给每组内的行分配从1开始的序号 df['role_num'] = df.groupby('ID').cumcount() + 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()
- 补全到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
相关产品推荐
相关产品推荐

