Python 熊猫数据帧-合并两个数据帧以确定历史/转换

Python 熊猫数据帧-合并两个数据帧以确定历史/转换,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我正在尝试跟踪一组交付的移动历史。我有两个数据帧-第一个是历史记录开始之前每个交付项目的最后一个已知位置: prior_location = pd.DataFrame([ {'Equip': 'A-1', 'Date': '2019-07-15', 'Location': '123 Main St.'}, {'Equip': 'A-2', 'Date': '2019-07-17', 'Location': '15 First Ave.'} ]) 接下来是交付历史记录: deli

我正在尝试跟踪一组交付的移动历史。我有两个数据帧-第一个是历史记录开始之前每个交付项目的最后一个已知位置:

prior_location = pd.DataFrame([
    {'Equip': 'A-1', 'Date': '2019-07-15', 'Location': '123 Main St.'},
    {'Equip': 'A-2', 'Date': '2019-07-17', 'Location': '15 First Ave.'}
])
接下来是交付历史记录:

deliveries = pd.DataFrame([
    {'Equip': 'A-1', 'Date': '2019-08-01', 'DeliveredTo': '191 Long Rd.'},
    {'Equip': 'A-1', 'Date': '2019-08-03', 'DeliveredTo': '582 Pleasant Court'},
    {'Equip': 'A-1', 'Date': '2019-08-04', 'DeliveredTo': 'SHOP'},
    {'Equip': 'A-2', 'Date': '2019-07-30', 'DeliveredTo': 'YARD'},
    {'Equip': 'A-2', 'Date': '2019-08-01', 'DeliveredTo': '191 Long Rd.'},
    {'Equip': 'A-2', 'Date': '2019-08-05', 'DeliveredTo': '15 Lake Drive'}
])
我的目标是生成一个数据帧,其中包含一个从中选取的
数据框,以及每次传递到
列中的
delivered。例如,最终的数据帧应类似于:

history = pd.DataFrame([
    {'Equip': 'A-1', 'Date': '2019-08-01', 'PickedUpFrom': '123 Main St.', 'DeliveredTo': '191 Long Rd.'},
    {'Equip': 'A-1', 'Date': '2019-08-03', 'PickedUpFrom': '191 Long Rd.', 'DeliveredTo': '582 Pleasant Court'},
    {'Equip': 'A-1', 'Date': '2019-08-04', 'PickedUpFrom': '582 Pleasant Court', 'DeliveredTo': 'SHOP'},
    {'Equip': 'A-2', 'Date': '2019-07-30', 'PickedUpFrom': '123 Main St.', 'DeliveredTo': 'YARD'},
    {'Equip': 'A-2', 'Date': '2019-08-03', 'PickedUpFrom': 'YARD', 'DeliveredTo': '191 Long Rd.'},
    {'Equip': 'A-2', 'Date': '2019-08-04', 'PickedUpFrom': '15 First Ave.', 'DeliveredTo': '15 Lake Drive'},
])
请注意,每个设备的第一个条目
PickedUpFrom
来自
prior\u location
表,随后的条目是上一行(对于该设备)
DeliveredTo

有没有想过一种有效的方法来实现这一点(我的实际数据集有几千件设备)


需要注意的几件事-每个设备在每个日期只有一次交付(因此
A-1
在给定的一天只在一个地点)。此外,
previous\u location
数据帧保证在交付数据帧中的第一个元素之前具有最后一个位置。

这里是单向优先
groupby
+
shift
,然后
使用
previous\u location

deliveries['PickedUpFrom']=deliveries.groupby('Equip').DeliveredTo.shift()
s=prior_location.set_index('Equip')['Location'].reindex(deliveries.Equip).values
deliveries['PickedUpFrom'].fillna(pd.Series(s,index=deliveries.index),inplace=True)
deliveries
Out[51]: 
  Equip        Date         DeliveredTo        PickedUpFrom
0   A-1  2019-08-01        191 Long Rd.        123 Main St.
1   A-1  2019-08-03  582 Pleasant Court        191 Long Rd.
2   A-1  2019-08-04                SHOP  582 Pleasant Court
3   A-2  2019-07-30                YARD       15 First Ave.
4   A-2  2019-08-01        191 Long Rd.                YARD
5   A-2  2019-08-05       15 Lake Drive        191 Long Rd.