我有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")
答案 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