在Python中匹配两个含重复值的DataFrame,用NaN填充缺失项
需求说明
我有两个包含重复值且大小不同的DataFrame,需要在Python中实现按匹配值的出现顺序关联,将第二个DataFrame的col2值对应填充到第一个DataFrame中,无匹配项的位置填充NaN。
输入DataFrame
第一个DataFrame(df1):
col1 0 1 1 2 2 3 3 4 4 5 5 1 6 2 7 3 8 4 9 5 10 1 11 2 12 3 13 4 14 5
第二个DataFrame(df2):
col1 col2 0 1 2 1 2 23 2 4 45 3 2 67 4 3 12 5 5 91 6 1 21 7 2 23 8 5 43
期望输出
最终得到的DataFrame如下:
col1 col2 0 1 2.0 1 2 23.0 2 3 12.0 3 4 45.0 4 5 91.0 5 1 21.0 6 2 67.0 7 3 NaN 8 4 NaN 9 5 43.0 10 1 NaN 11 2 23.0 12 3 NaN 13 4 NaN 14 5 NaN
实现代码
可以通过为两个DataFrame添加组内序号,再基于col1和组内序号进行合并来实现需求:
import pandas as pd # 构造输入的两个DataFrame df1 = pd.DataFrame({'col1': [1,2,3,4,5]*3}) df2 = pd.DataFrame({ 'col1': [1,2,4,2,3,5,1,2,5], 'col2': [2,23,45,67,12,91,21,23,43] }) # 为df1添加组内序号:按col1分组后,每组内的行号 df1['seq'] = df1.groupby('col1').cumcount() # 为df2添加组内序号:同样按col1分组后,每组内的行号 df2['seq'] = df2.groupby('col1').cumcount() # 基于col1和seq进行左合并,然后删除seq列 result = df1.merge(df2, on=['col1', 'seq'], how='left').drop('seq', axis=1) print(result)
代码说明
groupby('col1').cumcount():为每个col1分组内的行分配从0开始的连续序号,标记每个值在组内的出现顺序。merge(..., how='left'):以df1为基准,将df2中col1和序号都匹配的col2值填充进来,无匹配的位置自动填充NaN。- 最后删除辅助的
seq列,得到目标结果。
内容的提问来源于stack exchange,提问作者Tanmay singh
相关产品推荐
相关产品推荐

