Pandas中按顺序为重复row_hash生成递增连续分组编号的问题
解决Pandas连续相同值分组的rank问题
你的问题核心是要对连续相同的row_hash进行分组,而不是把所有相同row_hash的行归为一组——这属于数据处理里的"连续值岛屿"问题,之前的代码逻辑不对,所以得不到预期结果。
问题原因
你之前的代码是按ID和row_hash分组计算rank:
snapshot_df['dense_rank'] = snapshot_df.groupby(['ID', 'row_hash'])['snapshot_date'].rank( method='dense').astype(int)
这种方式会把同一个ID下所有row_hash=123的行(不管时间是否连续)归为同一组,所以1月1日和1月7日的123会共享同一个rank,不符合你要的"连续相同值算一组"的需求。
解决方案
要实现连续相同row_hash的分组rank,步骤如下:
- 先确保数据按ID和时间排序(必须保证顺序正确,否则结果会出错):
snapshot_df = snapshot_df.sort_values(['ID', 'snapshot_date'])
- 计算每个ID组内的row_hash变化标记:
对比当前行和前一行的row_hash,不同则标记为1,否则为0:
snapshot_df['hash_changed'] = snapshot_df.groupby('ID')['row_hash'].apply( lambda x: x != x.shift() ).astype(int)
- 累加变化标记得到目标rank:
对每个ID组内的变化标记做累加,每遇到一次变化(标记为1),rank就递增:
snapshot_df['需要的dense_rank'] = snapshot_df.groupby('ID')['hash_changed'].cumsum()
验证结果
运行上述代码后,生成的需要的dense_rank列会和你预期的完全一致:
| ID | snapshot_date | row_hash | 需要的dense_rank |
|---|---|---|---|
| qwe | 2024年1月1日 | 123 | 1 |
| qwe | 2024年1月3日 | 456 | 2 |
| qwe | 2024年1月5日 | 456 | 2 |
| qwe | 2024年1月7日 | 123 | 3 |
内容的提问来源于stack exchange,提问作者YRychkov
相关产品推荐
相关产品推荐

