如何无需循环生成DataFrame的version列以跟踪文件版本
问题描述
现有存储文件创建日期和升级日期的DataFrame,需新增version列跟踪文件版本。
原始数据集
| fileID | creationDate | upgradeDate |
|---|---|---|
| file_1 | 02/02/2022 15:00:00 | 02/02/2022 15:00:00 |
| file_1 | 02/02/2022 15:00:00 | 02/02/2022 15:30:00 |
| file_1 | 02/02/2022 15:00:00 | 10/02/2022 10:00:00 |
| file_2 | 03/02/2022 15:00:00 | 03/02/2022 15:00:00 |
| file_3 | 04/02/2022 15:00:00 | 04/02/2022 15:00:00 |
| file_3 | 04/02/2022 15:00:00 | 05/02/2022 15:00:00 |
期望结果
| fileID | creationDate | upgradeDate | version |
|---|---|---|---|
| file_1 | 02/02/2022 15:00:00 | 02/02/2022 15:00:00 | 1 |
| file_1 | 02/02/2022 15:00:00 | 02/02/2022 15:30:00 | 2 |
| file_1 | 02/02/2022 15:00:00 | 10/02/2022 10:00:00 | 3 |
| file_2 | 03/02/2022 15:00:00 | 03/02/2022 15:00:00 | 1 |
| file_3 | 04/02/2022 15:00:00 | 04/02/2022 15:00:00 | 1 |
| file_3 | 04/02/2022 15:00:00 | 05/02/2022 15:00:00 | 2 |
现有循环实现
ids = df['fileID'].unique().tolist() for id in ids: df.loc[df['fileID'] == id, 'version'] = range(1, len(df.loc[df['fileID'] == id]) + 1)
无循环解决方案
方法1:groupby + cumcount()(推荐)
先按fileID和upgradeDate排序,确保版本号按升级时间顺序分配,再通过分组计数生成版本号:
# 先排序保证版本顺序正确 df = df.sort_values(['fileID', 'upgradeDate']) # 生成version列,cumcount从0开始计数,加1得到从1起始的版本号 df['version'] = df.groupby('fileID').cumcount() + 1
方法2:groupby + rank()
通过对每个文件的upgradeDate排名生成版本号,method='first'确保相同日期(如果存在)按出现顺序排名:
df['version'] = df.groupby('fileID')['upgradeDate'].rank(method='first').astype(int)
两种方法均为Pandas矢量化操作,相比循环效率更高,尤其适合大规模数据集。
内容的提问来源于stack exchange,提问作者CBO
相关产品推荐
相关产品推荐

