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.