Python 获取两个数据帧之间最近的元素-多个条件

Python 获取两个数据帧之间最近的元素-多个条件,python,dataframe,Python,Dataframe,我正在比较两个数据帧 我想获得两个数据帧之间最接近的匹配项 DF1 Item Location Fabric Date produced item1 Spain AB2 11/01/2015 item2 France ST1 25/04/2017 DF2 Alternative Item Location Fabric Date produced alternative_item1 Spain

我正在比较两个数据帧

我想获得两个数据帧之间最接近的匹配项

DF1

Item   Location   Fabric   Date produced

item1     Spain     AB2     11/01/2015
item2     France    ST1     25/04/2017


DF2

Alternative Item      Location    Fabric   Date produced

alternative_item1        Spain       AB6      15/01/2015
alternative_item2        Spain       AB2      25/05/2014
alternative_item3        Spain       AB2      11/03/2013
alternative_item4       France       ST1      25/04/2017
alternative_item5           UK       ST1      19/02/2020
alternative_item6        Italy       ST1      07/04/2012

上面,在DF1上我有2个项目,在DF2上我有替代项目。 我希望得到两个DFs之间最接近的匹配对,如下所示

DF_Final

Item     Alternative Item

item1   alternative_item2     
item2   alternative_item4

项目1与备选项目2配对,因为它们的“位置”和“结构”相同,并且生产日期最接近(备选项目3在时间上更遥远)

同样,item2与alternative_item4配对,因为这是唯一符合“Location”和“Fabric”标准的备选项

你会用什么方法来解决这个问题


谢谢大家!

您可以按
位置
结构
合并,然后按
位置
结构
分组,并选择最小差异:

out = pd.merge(df1, df2, on=['Location', 'Fabric'])
out['diff'] = out['Date produced_x'] - out['Date produced_y']
out = out.iloc[out.groupby(['Location', 'Fabric'])['diff'].agg(lambda x: x.sort_values().head(1).index)][['Item', 'Alternative Item']]

print(out)
印刷品:

    Item   Alternative Item
2  item2  alternative_item4
0  item1  alternative_item2

您可以按
位置
结构
合并,然后按
位置
结构
分组,并选择最小差异:

out = pd.merge(df1, df2, on=['Location', 'Fabric'])
out['diff'] = out['Date produced_x'] - out['Date produced_y']
out = out.iloc[out.groupby(['Location', 'Fabric'])['diff'].agg(lambda x: x.sort_values().head(1).index)][['Item', 'Alternative Item']]

print(out)
印刷品:

    Item   Alternative Item
2  item2  alternative_item4
0  item1  alternative_item2

事实上,我现在已经看到,并非所有项目都与备选项目配对,尽管它们都有备选项目。我将尝试在这里添加一个更详细的例子。@Rodrigo最好在这里创建一个新问题,这样更多的人可以看到它。实际上我错了。你所做的是完美的,这肯定会帮助其他人!我所要做的就是根据我的具体情况调整merge和groupby中使用的列。为了得到我想要的东西,我不得不尝试不同的组合。就是这样。非常感谢。事实上,我现在已经看到,并非所有项目都与备选项目配对,尽管它们都有备选项目。我将尝试在这里添加一个更详细的例子。@Rodrigo最好在这里创建一个新问题,这样更多的人可以看到它。实际上我错了。你所做的是完美的,这肯定会帮助其他人!我所要做的就是根据我的具体情况调整merge和groupby中使用的列。为了得到我想要的东西,我不得不尝试不同的组合。就是这样。非常感谢。