Mam dwa dataframe, które porównuję.

Chciałbym uzyskać najbliższy pasujący element między dwoma dataframami.

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

Powyżej, na DF1 mam 2 przedmioty i DF2 mam alternatywne przedmioty. Chcemy uzyskać najbliższą pasującą parę między dwoma DFS, jak poniżej.

DF_Final

Item     Alternative Item

item1   alternative_item2     
item2   alternative_item4

Pozycja1 zostaje sparowany z alternatywą_itum2, ponieważ ich "lokalizacja" i "tkanina" jest taka sama, a daty produkcyjne są najbliżej (alternatywa_itum3 jest bardziej odległe czasowniki).

W ten sam sposób, Item2 zostaje sparowany z alternatywą_itum4, ponieważ jest to jedyna alternatywna pozycja pasująca do kryteriów "Lokalizacja" i "tkaniny".

Jakich metod użyłbyś, aby to rozwiązać?

Dziękuję Ci!

1
Rodrigo 29 październik 2020, 12:40

1 odpowiedź

Najlepsza odpowiedź

Możesz scalić przez Location i Fabric, a następnie grupę przez Location, Fabric i wybrał minimalną różnicę:

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)

Wydruki:

    Item   Alternative Item
2  item2  alternative_item4
0  item1  alternative_item2
0
Andrej Kesely 29 październik 2020, 10:20