如何为pandas dataframe中的重复行生成序列号
给Pandas DataFrame的重复行生成序列号
嘿,这个需求用Pandas的groupby+cumcount()就能轻松搞定,我给你一步步讲清楚:
1. 先明确重复判断的依据
你提到是按id、时间点和日期来判断重复行,那我们就以这几列为分组依据。先看个模拟你的数据场景:
import pandas as pd # 模拟你的数据场景 data = { 'id': ['001', '001', '001', '002', '002'], 'date': ['2024-05-20', '2024-05-20', '2024-05-21', '2024-05-20', '2024-05-20'], 'time': ['10:00', '10:00', '10:00', '14:30', '14:30'], 'value': [10, 10, 20, 30, 30] } df = pd.DataFrame(data)
2. 生成序列号的核心代码
直接用groupby按指定列分组,再用cumcount()给每组内的行计数(注意cumcount()默认从0开始,加1让序列号从1起始):
# 按id、date、time分组,生成从1开始的序列号 df['sequence'] = df.groupby(['id', 'date', 'time']).cumcount() + 1
3. 最终效果
运行后你的DataFrame会变成这样:
| id | date | time | value | sequence | |
|---|---|---|---|---|---|
| 0 | 001 | 2024-05-20 | 10:00 | 10 | 1 |
| 1 | 001 | 2024-05-20 | 10:00 | 10 | 2 |
| 2 | 001 | 2024-05-21 | 10:00 | 20 | 1 |
| 3 | 002 | 2024-05-20 | 14:30 | 30 | 1 |
| 4 | 002 | 2024-05-20 | 14:30 | 30 | 2 |
额外场景处理
如果你的重复判断是基于所有列(即整行值完全相同才算重复),可以直接用所有列作为分组键:
# 基于整行重复生成序列号 df['sequence'] = df.groupby(df.columns.tolist()).cumcount() + 1
小提示
- 如果数据里有缺失值,
groupby会把含NaN的行归为一组(因为NaN和NaN在分组时被视为相等),如果不想这样,建议先处理缺失值 - 要是需要按特定顺序生成序列号,可以先对DataFrame排序,比如
df = df.sort_values(['id', 'date', 'time']),再执行上面的分组计数操作
内容的提问来源于stack exchange,提问作者Hanif
相关产品推荐
相关产品推荐

