如何在Pandas中查找重复项并将对应值转换为多列展示?
解决Pandas中重复项对应值转多列的问题
要实现将重复name对应的value拆分为多列展示的需求,可以通过分组标记序号+透视转宽表的方式完成,以下是具体步骤和代码:
完整实现代码
import pandas as pd df = pd.DataFrame( [ ['A',1], ['B',2], ['C',3], ['D',4], ['E',5], ['C',6], ['D',7], ['E',8], ['F',9], ['G',10] ],columns=['name','value']) # 1. 筛选出存在重复的name记录 df_dup = df[df.duplicated(['name'], keep=False)] # 2. 为每个name下的value添加序号(1、2...) df_dup['col_num'] = df_dup.groupby('name').cumcount() + 1 # 3. 透视转换为宽表,并调整列名 result = df_dup.pivot(index='name', columns='col_num', values='value').reset_index() result.columns = ['name'] + [f'value{i}' for i in result.columns[1:]] # 4. 同步原数据中每个name首次出现的索引(可选,匹配期望输出的索引) result.index = df_dup.groupby('name').first().index print(result)
代码解释
- 筛选重复项:使用
duplicated(keep=False)保留所有存在重复的name行,和你原有代码逻辑一致。 - 添加组内序号:
groupby('name').cumcount()会为每个name分组内的行生成从0开始的序号,加1后得到1、2,后续用来作为列名的后缀。 - 透视转宽表:
pivot方法将长格式数据转为宽格式,把每个name对应的多个value拆分成单独的列。 - 调整列名与索引:将自动生成的列名(1、2)改为
value1、value2,同时设置结果索引为原数据中每个name第一次出现的索引,和期望输出完全匹配。
最终输出
name value1 value2 2 C 3 6 3 D 4 7 4 E 5 8
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

