Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并具有多列和公差的数据帧_Python_Pandas_Dataframe_Merge - Fatal编程技术网

Python 合并具有多列和公差的数据帧

Python 合并具有多列和公差的数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有两个数据帧,我想合并使用2列作为键,并创建另一个合并的数据帧。 这里,Column1是String,Columns2是float数据类型。 我想在第2列上加上.01的公差,这样来自dataframe1的(John,1.12)和来自dataframe2的(John,1.13)应该在同一行中。 我怎样才能做到这一点 例如: 2个数据帧: df1 = pd.DataFrame({"Name":["John","Millon"], &quo

我有两个数据帧,我想合并使用2列作为键,并创建另一个合并的数据帧。 这里,Column1是String,Columns2是float数据类型。 我想在第2列上加上.01的公差,这样来自dataframe1的(John,1.12)和来自dataframe2的(John,1.13)应该在同一行中。 我怎样才能做到这一点

例如: 2个数据帧:

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"]})
如果我这样做:

dfMerge = pd.merge(df1,df2,on=["Name","MarketVal"], how= "outer")
然后,这将为“John”创建两个单独的行,因为MarketVal在两个数据帧中是不同的。但我想在这个问题上保持0.01的公差,以便它们位于同一行

    Actual :->
     Name  MarketVal Left_Product right_Product
0    John       1.12        Sugar           NaN
1  Millon       2.11         Salt           NaN
2    John       1.13          NaN         Sugar
3     Rex       3.11          NaN          Salt

Expected :->

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

仅在
'Name'
上合并
,然后使用掩码仅保留在所需公差范围内的行。由于外部联接,如果任何“MarketVal”为null,我们也会保留一行。如果来自外部合并中的正确数据帧,我们还需要更新
'MarketVal'

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
中匹配的多行,这将保留所有组合。在这里,我为John添加了另一行,其中的“Coffee”应该与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

那么,如果有多个左或右产品在同一名称MarketVal的收费范围内,会发生什么呢。例如,DF2中的另一个John 1.13看看,如果多行在公差范围内,它应该创建另一行。也就是说,如果df2中的3行在df1的公差范围内,则应为每个组合创建3行。此外,merge asof不处理多个列。谢谢帮助。我将检查真实数据,并将更新。