基于Candidate_Name列展平Pandas DataFrame,merge方法未获预期结果求助
基于Candidate_Name列展平Pandas DataFrame的正确方法
嗨,我来帮你搞定这个问题~你用df.merge(df, on=('Candidate_Name'))没得到预期结果,是因为这个操作会生成笛卡尔积——同一个Candidate_Name下的每一行都会和同组的所有行配对,最终得到的是大量重复组合的行,完全不是你想要的「合并同名字为单行」的效果。
下面是实现你需求的正确步骤:
核心思路
给每个Candidate_Name分组内的行添加唯一序号,然后通过透视(pivot)操作把多行转成同一行的多列,自动给重复的列名添加后缀(比如_0、_1),最终实现展平效果。
具体代码示例
假设你的原始DataFrame长这样:
import pandas as pd # 示例数据 data = { 'Candidate_Name': ['Alice', 'Alice', 'Bob', 'Bob', 'Bob'], 'Skill': ['Python', 'SQL', 'Java', 'C++', 'JavaScript'], 'Experience': [3, 2, 5, 4, 1], 'Location': ['NY', 'NY', 'CA', 'CA', 'CA'] } df = pd.DataFrame(data)
执行以下代码完成展平:
# 1. 给每个候选者的行添加分组内的序号 df['row_index'] = df.groupby('Candidate_Name').cumcount() # 2. 透视表:把行转成列,以Candidate_Name为索引,序号为列 flattened_df = df.pivot(index='Candidate_Name', columns='row_index') # 3. 把多级列名合并为单级(比如Skill_0、Experience_1) flattened_df.columns = ['_'.join(map(str, col)) for col in flattened_df.columns] # 4. 重置索引,让Candidate_Name回到列的位置 flattened_df = flattened_df.reset_index()
最终输出效果
处理后的DataFrame会把同一个Candidate_Name的所有行合并为单行,重复列名自动带上序号后缀:
Candidate_Name Skill_0 Skill_1 Skill_2 Experience_0 Experience_1 Experience_2 Location_0 Location_1 Location_2 0 Alice Python SQL NaN 3 2 NaN NY NY NaN 1 Bob Java C++ JavaScript 5 4 1 CA CA CA
补充说明
- 如果你的数据中有完全重复的行,可以先通过
df.drop_duplicates(subset=['Candidate_Name'])去重后再执行上述步骤 - 如果你偏好
_x、_y这类后缀而不是序号,可以把cumcount()生成的序号替换成自定义的标记(比如['x', 'y', 'z']),不过序号的方式更通用,适配任意数量的行
内容的提问来源于stack exchange,提问作者noobie-php
相关产品推荐
相关产品推荐

