熊猫合并具有多个列和公差的数据框

时间:2020-07-29 17:42:58

标签: python pandas dataframe merge

我有2个数据框,我想使用2列作为键进行合并,并创建另一个合并的数据框。 在这里,Column1是String,Columns2是float数据类型。 我想在列2上放置0.01的公差,以使dataframe1中的(John,1.12)和dataframe2中的(John,1.13)应该位于同一行。 我该如何实现?

例如: 2个数据框:

let

如果我愿意的话:

df1 = pd.DataFrame({"Name":["John","Millon"], "MarketVal":[1.12,2.11], "Left_Product":["Sugar","Salt"]})
df2 = pd.DataFrame({"Name":["John","Rex"], "MarketVal":[1.13,3.11], "right_Product":["Sugar","Salt"]})

然后这将为“ John”创建2个单独的行,因为两个数据帧中的MarketVal不同。但是我想对此保持0.01的公差,以便它们排在同一行。

dfMerge = pd.merge(df1,df2,on=["Name","MarketVal"], how= "outer")

1 个答案:

答案 0 :(得分:1)

merge仅在'Name'上使用,然后使用遮罩仅保留期望公差内的行。由于外部联接,如果'MarketVal'为空,我们还将保留一行。如果'MarketVal'来自外部合并中的正确DataFrame,我们还需要对其进行更新。

tol = 0.01
m = df1.merge(df2, on='Name', how='outer', suffixes=['', '_r'])
m = m[(m['MarketVal'] - m['MarketVal_r']).abs().le(tol)
      | m[['MarketVal', 'MarketVal_r']].isnull().any(1)]

#     Name  MarketVal Left_Product  MarketVal_r right_Product
#0    John       1.12        Sugar         1.13         Sugar
#1  Millon       2.11         Salt          NaN           NaN
#2     Rex        NaN          NaN         3.11          Sal

m['MarketVal'] = m['MarketVal'].fillna(m['MarketVal_r'])
m = m.drop(columns='MarketVal_r')

#     Name  MarketVal Left_Product right_Product
#0    John       1.12        Sugar         Sugar
#1  Millon       2.11         Salt           NaN
#2     Rex       3.11          NaN          Salt

df2中匹配多行的情况下,这将保留所有组合。在这里,我为约翰添加了另一行带有“咖啡”的行,该行应与df1中的第一行匹配,而另一行则不应与任何内容匹配。

df1 = pd.DataFrame({'Name': ['John', 'Millon'], 
                    'MarketVal': [1.12, 2.11], 'Left_Product':['Sugar', 'Salt']})
df2 = pd.DataFrame({'Name': ['John', 'Rex', 'John', 'John'], 
                    'MarketVal': [1.13, 3.11, 1.125, 17], 
                    'right_Product': ['Sugar', 'Salt', 'coffee', 'bad_item']})

#... the above code
print(m)

     Name  MarketVal Left_Product right_Product
0    John       1.12        Sugar         Sugar
1    John       1.12        Sugar        Coffee
3  Millon       2.11         Salt           NaN
4     Rex       3.11          NaN          Salt