如何用Python对多列值升序排序并透视,按ID整理时序位置数据?
Pandas按ID分组并将时序数据转换为结构化多列
需要处理一个包含datetime类型列start的Pandas DataFrame,实现以下操作:
- 按
ID字段分组 - 每个分组内按照
start时间先后对location和start数据排序 - 将排序后的数据转换为
location1、start1、location2、start2这类结构化多列形式
示例数据
import pandas as pd df = pd.DataFrame(data={'ID':['a1','a2','a1','a1','a2','a2'], 'location':['bali','mosta','road','joha','alabama','vinice'], 'start':[pd.to_datetime('2022-11-18 16:28:35'), pd.to_datetime('2022-11-18 17:28:35'), pd.to_datetime('2022-11-19 16:28:35'), pd.to_datetime('2022-11-19 17:28:35'), pd.to_datetime('2022-11-19 17:18:35'), pd.to_datetime('2022-11-19 17:18:35') ]})
原始数据展示:
ID location start 0 a1 bali 2022-11-18 16:28:35 1 a2 mosta 2022-11-18 17:28:35 2 a1 road 2022-11-19 16:28:35 3 a1 joha 2022-11-19 17:28:35 4 a2 alabama 2022-11-19 17:18:35 5 a2 vinice 2022-11-19 17:18:35
解决方案
# 按ID分组,每组内按start排序后添加行序号 df_sorted = df.sort_values(['ID', 'start']).groupby('ID').cumcount() + 1 # 透视数据,将序号作为列的区分标识 result = df.assign(num=df_sorted).pivot(index='ID', columns='num', values=['location', 'start']) # 重命名列,转为location1、start1的格式 result.columns = [f'{col[0]}{col[1]}' for col in result.columns] # 重置索引,让ID成为普通列 result = result.reset_index()
预期结果
对应示例结果的代码:
new_data = pd.DataFrame(data={'ID':['a1','a2',], 'location1':['bali','mosta'], 'start1':[pd.to_datetime('2022-11-18 16:28:35'),pd.to_datetime('2022-11-18 17:28:35') ], 'location2':['road','alabama'], 'start2': [pd.to_datetime('2022-11-19 16:28:35'),pd.to_datetime('2022-11-19 17:18:35')], 'location3':['joha','vinice'], 'start3': [pd.to_datetime('2022-11-19 17:28:35'),pd.to_datetime('2022-11-19 17:18:35')], })
结果展示:
ID location1 start1 location2 start2 location3 start3 0 a1 bali 2022-11-18 16:28:35 road 2022-11-19 16:28:35 joha 2022-11-19 17:28:35 1 a2 mosta 2022-11-18 17:28:35 alabama 2022-11-19 17:18:35 vinice 2022-11-19 17:18:35
内容的提问来源于stack exchange,提问作者phœnix
相关产品推荐
相关产品推荐

