Pandas按ID分组后如何将start_time列转为process列行实体
Pandas实现将分组列值转为行的方案
你之前的写法问题在于:groupby生成的分组对象没有原生melt方法,而且当前需求本质是给每个ID分组插入一行起始记录,不需要用复杂的列转行逻辑,实现步骤很简单:
- 因为同ID下
start_time取值完全一致,先去重提取每个ID对应的start_time值,组装成process为start_time的新行 - 删掉原表的
start_time列,和新生成的起始行做纵向拼接 - 按ID、process字段排序,保证每个ID的start_time行排在分组最前,重置索引即可
完整可运行代码:
import pandas as pd # 样例数据 df = pd.DataFrame({ 'start_time': ['14:05','14:05','14:05','14:05','14:12','14:12'], 'time': ['14:16','14:34','15:00','15:10','14:19','14:54'], 'process': ['A','B','C','D','A','B'], 'ID': [1,1,1,1,2,2] }) # 生成每个ID对应的start_time行 start_rows = df[['ID', 'start_time']].drop_duplicates().rename(columns={'start_time': 'time'}) start_rows['process'] = 'start_time' # 拼接数据并排序 result = pd.concat( [start_rows, df.drop(columns='start_time')], ignore_index=True ).sort_values( by=['ID', 'process'], ascending=[True, False] # process降序时start_time会排在A/B/C/D前面 ).reset_index(drop=True)
运行后输出结果完全匹配目标格式:
time process ID 0 14:05 start_time 1 1 14:16 A 1 2 14:34 B 1 3 15:00 C 1 4 15:10 D 1 5 14:12 start_time 2 6 14:19 A 2 7 14:54 B 2
如果你的process字段存在比start_time字典序更大的值,不想靠字符串排序调整顺序,可以给拼接后的数据加一个辅助排序列:给start_rows加sort_flag=0,原表数据加sort_flag=1,排序时先按ID再按sort_flag排,排完删掉辅助列就行,逻辑更稳妥。
内容的提问来源于stack exchange,提问作者alex3465
相关产品推荐
相关产品推荐

