我有两个数据框,其中第一个df1
包含类似的销售数据
Item Revenue Date
ring 200 2018-05-21
led 51 2018-09-18
ring 600 2018-12-25
,第二个df2
包含每个项目的卖方分配。请注意,分配可能会随时间变化,并且会保留历史记录
Item Seller Since_when
led Mike 2018-01-01
ring John 2018-01-01
ring Mike 2018-12-01
想法是通过日期规则合并Item
上的两个数据框,以便将销售分配给在那一刻实际出售该商品的卖方,从而得到
Item Revenue Date Seller
ring 200 2018-05-21 John
led 51 2018-09-18 Mike
ring 600 2018-12-25 Mike (Mike started selling rings on December)
是否可以告诉pd.merge
使用第二个数据帧的最新行?
修改
代码如下:
import pandas as pd
m1 = pd.DataFrame([['ring', 200, 2018, 5, 21], ['led', 51, 2018, 9, 18], ['ring', 600, 2018, 12, 25]])
m1.columns = ['item', 'revenue', 'año', 'mes', 'dia']
m1['date'] = m1['año'].astype(str) + '-' + m1['mes'].astype(str) + '-' + m1['dia'].astype(str)
m2 = pd.DataFrame([['led', 'Mike', '2018-01-01'], ['ring', 'John', '2018-01-01'], ['ring', 'Mike', '2018-12-01']])
m2.columns = ['item', 'persona', 'fecha']
m = (pd.merge_asof(m1.sort_values('date'), m2.sort_values('fecha'),
by='item', left_on='date', right_on='fecha')
.drop(columns='fecha'))
答案 0 :(得分:0)
要结合使用精确键和最近键(过去),请使用pd.merge_asof
。默认方向为'backward'
。
import pandas as pd
m = (pd.merge_asof(df1.sort_values('Date'), df2.sort_values('Since_when'),
by='Item', left_on='Date', right_on='Since_when')
.drop(columns='Since_when'))
m
Item Revenue Date Seller
0 ring 200 2018-05-21 John
1 led 51 2018-09-18 Mike
2 ring 600 2018-12-25 Mike