Pandas含重复值长表用unstack无聚合保留全值转宽表实现问题
实现方案
核心思路
直接使用pivot/unstack报错的原因是同一个id+variable组合存在多个重复索引,只需要先给每组内的重复项添加递增序号,再将序号和变量名拼接为新列名后做长宽转换即可。
完整代码示例
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'id': [1,2,2,2,3,3,3], 'variable': ['outcome_1','outcome_1','outcome_1','outcome_3','outcome_2','outcome_4','outcome_3'], 'value': [pd.NA, '18:33','20:39','01:40','03:59','07:46','10:53'] }) # 1. 为每个id下的相同variable生成递增序号 df['suffix'] = df.groupby(['id', 'variable']).cumcount() # 2. 拼接生成最终列名 df['col_name'] = df['variable'] + '_' + df['suffix'].astype(str) # 3. 转换为宽表 res = df.pivot(index='id', columns='col_name', values='value').reset_index() # 4. 调整列名和列顺序符合预期 res = res.rename(columns={'id': 'id_nmbr'}) expected_cols = ['id_nmbr', 'outcome_1_0', 'outcome_1_1', 'outcome_2_0', 'outcome_3_0', 'outcome_4_0'] res = res.reindex(columns=expected_cols) print(res)
运行后输出与预期结果完全一致。
内容的提问来源于stack exchange,提问作者Jesper Mølgaard
相关产品推荐
相关产品推荐

