熊猫根据时间戳合并

时间:2019-06-10 15:41:37

标签: python pandas

我有两个数据框,其中第一个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'))

1 个答案:

答案 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