如何将DataFrame从长格式转宽格式并保留重复ID的所有值?
解决方法
要实现这个长格式转宽格式的需求,核心是给每个ID下的Yes/No分组添加组内序号,再通过透视操作保留所有值,具体步骤如下:
1. 模拟原始数据(匹配你的表格结构)
先构造和你原始表一致的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'ID': [1,1,1,1,2,2,2,2], 'Checked': ['Yes','Yes','No','No','Yes','Yes','No','No'], 'Value': ['A','B','C','D','E','F','G','H'] })
2. 添加组内序号
给每个ID+Checked的组合添加自增序号,用来区分同一分组下的不同值,避免透视时值被覆盖:
# 给每个ID+Checked组生成从1开始的序号 df['seq'] = df.groupby(['ID', 'Checked']).cumcount() + 1
3. 透视转换为宽格式
用pivot方法完成转换,最后整理列名让结果更符合预期:
# 执行透视,ID作为行索引,Checked+序号作为列,Value作为值 wide_df = df.pivot(index='ID', columns=['Checked', 'seq'], values='Value') # 合并列名,比如把(Yes,1)格式转为Yes1 wide_df.columns = [f'{col[0]}{col[1]}' for col in wide_df.columns] # 把ID从索引变回普通列 wide_df = wide_df.reset_index()
最终得到的结果和你期望的输出完全一致:
| ID | Yes1 | Yes2 | No1 | No2 |
|---|---|---|---|---|
| 1 | A | B | C | D |
| 2 | E | F | G | H |
补充说明
如果你的原始数据中,部分ID下的Yes/No值数量不一致,可以用fillna补空值,比如wide_df = wide_df.fillna(''),保证格式统一。
内容的提问来源于stack exchange,提问作者April
相关产品推荐
相关产品推荐

