【问题标题】:merge dataframes on multiple columns ignoring order忽略顺序合并多列上的数据框
【发布时间】:2021-02-13 06:24:56
【问题描述】:

我有以下数据框:

df1=pd.DataFrame({'fr':[1,2,3],'to':[4,5,6],'R':[0.1,0.2,0.3]})
df2=pd.DataFrame({'fr':[1,5,3],'to':[4,2,6],'X':[0.4,0.5,0.6]})

我想在 fr 和 to 上合并这两个数据帧,忽略 fr 和 to 的顺序,即 (2,5) 与 (5,2) 相同。期望的输出是:

dfO=pd.DataFrame({'fr':[1,2,3],'to':[4,5,6],'R':[0.1,0.2,0.3],'X':[0.4,0.5,0.6]})

dfO=pd.DataFrame({'fr':[1,5,3],'to':[4,2,6],'R':[0.1,0.2,0.3],'X':[0.4,0.5,0.6]})

我可以做到以下几点:

pd.merge(df1,df2,on=['fr','to'],how='left')

但是,正如预期的那样,第二行的 X 值是 NaN。

感谢您的帮助。

【问题讨论】:

    标签: python-3.x pandas merge


    【解决方案1】:

    你可以创建一个临时字段,然后加入它

    df1['tmp'] = df1.apply(lambda x: ','.join(sorted([str(x.fr), str(x.to)])), axis=1)
    df2['tmp'] = df2.apply(lambda x: ','.join(sorted([str(x.fr), str(x.to)])), axis=1)
    

    这将给出您期望的结果

    pd.merge(df1,df2[['tmp',  'X']],on=['tmp'], how='left').drop(columns=['tmp'])
    

    【讨论】:

    • 非常感谢@Cenk。我接受另一个答案只是因为它更有效。但是,您的方法效果很好:)
    • 是的,我看到了答案,我同意它更有效:)
    【解决方案2】:

    你需要先做numpysort

    df1[['fr','to']] = np.sort(df1[['fr','to']].values,1)
    df2[['fr','to']] = np.sort(df2[['fr','to']].values,1)
    out = df1.merge(df2,how='left')
    out
    Out[44]: 
       fr  to    R    X
    0   1   4  0.1  0.4
    1   2   5  0.2  0.5
    2   3   6  0.3  0.6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2023-02-25
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多