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

如何在Pandas DataFrame中按名称分组生成chronology列

实现分组内基于Timestamp的时序序号生成

你需要按name分组,根据timestamp的大小生成反转的时序序号,并保留原始数据的顺序,以下是两种可行的实现方法:

方法一:通过排序+恢复索引实现

这种方法逻辑直观,适合理解分组内序号生成的过程:

import pandas as pd

# 初始化原始数据
df = pd.DataFrame({'name':['tom','tom','tom','bert','bert','sam'], 
                   'timestamp':[15,13,14,23,22,14]})

# 1. 保留原始索引,用于后续恢复数据顺序
df['original_idx'] = df.index

# 2. 按name分组、timestamp升序排序,生成基础时序序号
df_sorted = df.sort_values(['name', 'timestamp'])
df_sorted['chronology'] = df_sorted.groupby('name').cumcount() + 1  # 从1开始计数

# 3. 反转分组内的序号(将升序序号转为降序分配)
df_sorted['chronology'] = df_sorted.groupby('name')['chronology'].transform(
    lambda x: x.max() - x + 1
)

# 4. 恢复原始数据顺序并删除临时索引列
df_final = df_sorted.sort_values('original_idx').drop('original_idx', axis=1)

方法二:使用rank函数直接生成(更简洁)

利用rank函数直接获取每个timestamp在分组内的排名,再反转排名得到目标序号,无需排序和恢复索引:

import pandas as pd

df = pd.DataFrame({'name':['tom','tom','tom','bert','bert','sam'], 
                   'timestamp':[15,13,14,23,22,14]})

# 获取每个timestamp在分组内的升序排名(最小的timestamp排名为1)
df['chronology'] = df.groupby('name')['timestamp'].rank(method='min', ascending=True).astype(int)

# 反转分组内的排名,得到目标时序序号
df['chronology'] = df.groupby('name')['chronology'].transform(
    lambda x: x.max() - x + 1
)

两种方法执行后都会得到你需要的结果:

name  timestamp  chronology
0  tom         15           3
1  tom         13           2
2  tom         14           1
3  bert        23           2
4  bert        22           1
5  sam         14           1

内容的提问来源于stack exchange,提问作者econben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:10:29