输出:
我有两个数据帧,其中第一个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'))
对于精确键和最近键的组合(过去(,请使用 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