如何在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
相关产品推荐
相关产品推荐

