You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:57:22