如何合并含重复值的DataFrame?其中一个DataFrame指定列值固定出现4次
解决重复值DataFrame的精准合并问题
嘿,这个场景我之前碰到过,核心思路是给每个重复的分组添加组内序号,让原本重复的A列值能和对应的行精准匹配,具体操作步骤如下:
步骤1:给两个DataFrame添加组内计数列
我们用groupby().cumcount()来生成每个A值在组内的出现序号(从0开始递增),这样每个(A, count)组合就能唯一标识一行:
# 给df添加组内计数 df['count'] = df.groupby('A').cumcount() # 给df_key添加组内计数 df_key['count'] = df_key.groupby('A').cumcount()
cumcount()的作用是对每个分组内的行进行连续计数,比如foo在df里的4行,会被标记为0、1、2、3;df_key里的foo两行会被标记为0、1,刚好能对应上。
步骤2:基于A和count列执行合并
用pd.merge()同时以A和count作为连接键,选择how='left'来保留df里的所有行(即使df_key里没有对应序号的行,会自动填充NaN):
merged_df = pd.merge(df, df_key, on=['A', 'count'], how='left')
完整示例演示
我把你给出的示例数据完善后,跑一遍完整流程:
import pandas as pd # 构造你的原始df df = pd.DataFrame([['foo'], ['foo'], ['foo'], ['foo'], ['bar'], ['bar'], ['bar'], ['bar']], columns=['A']) # 构造修正后的df_key(修正了原示例里的['...'],改成合理的行) df_key = pd.DataFrame([['foo', 1, 2], ['foo', 3, 4], ['bar', 5, 9], ['bar', 2, 4], ['bar', 7, 8]], columns=['A', 'B', 'C']) # 添加组内计数列 df['count'] = df.groupby('A').cumcount() df_key['count'] = df_key.groupby('A').cumcount() # 执行合并 merged_df = pd.merge(df, df_key, on=['A', 'count'], how='left') print(merged_df)
输出结果:
A count B C 0 foo 0 1.0 2.0 1 foo 1 3.0 4.0 2 foo 2 NaN NaN 3 foo 3 NaN NaN 4 bar 0 5.0 9.0 5 bar 1 2.0 4.0 6 bar 2 7.0 8.0 7 bar 3 NaN NaN
结果说明
- 对于
foo:df里有4行,df_key里只有2行,所以后两行合并后填充NaN - 对于
bar:df里有4行,df_key里有3行,最后一行填充NaN - 如果df_key里某个
A值的出现次数超过4次,合并时只会匹配前4次(因为df里只有4行),不会额外增加行数
内容的提问来源于stack exchange,提问作者Michael Henry
相关产品推荐
相关产品推荐

