如何在Pandas中为关联行批量分配相同随机ID(按用户及14天间隔)
解决Pandas中按用户分组、时间间隔关联行分配唯一随机ID的问题
核心思路
你之前的问题在于直接用np.where分配uuid.uuid4()时,该函数只会执行一次,导致所有符合条件的行共用同一个ID。正确的做法是:先给每个用户内的关联交易组打上唯一组标签,再为每个组分配独立的随机ID。
完整代码实现
import pandas as pd import numpy as np import uuid # 1. 生成测试数据 dummy_df = pd.DataFrame({ 'transactionid': [1,2,3,4,5,6,7,8], 'user': ['Michael','Michael','Michael','Tom','Tom','Tom','Tom','Tom'], 'transactiontime': pd.to_datetime([ '2023-01-01', '2023-01-10', '2023-01-20', '2023-02-01', '2023-02-10', '2023-03-01', '2023-03-10', '2023-04-01' ]) }) # 2. 按用户+交易时间排序 dummy_df = dummy_df.sort_values(['user', 'transactiontime']).reset_index(drop=True) # 3. 计算用户内相邻交易的时间差(单位:天) dummy_df['timediff'] = dummy_df.groupby('user')['transactiontime'].diff().dt.days # 4. 为每个用户内的关联组生成组标签 # 逻辑:相邻时间差>14天则开启新组,用cumsum累加组号 dummy_df['group_tag'] = dummy_df.groupby('user')['timediff'].apply( lambda x: (x > 14).cumsum() ).reset_index(level=0, drop=True) # 5. 为每个(用户+组标签)组合分配唯一随机ID # 提取所有唯一组,生成uuid映射 unique_groups = dummy_df[['user', 'group_tag']].drop_duplicates() unique_groups['association_id'] = unique_groups.apply(lambda _: uuid.uuid4(), axis=1) # 6. 将关联ID合并回原数据框 dummy_df = dummy_df.merge(unique_groups, on=['user', 'group_tag'], how='left') # 查看最终结果(保留关键字段) print(dummy_df[['transactionid', 'user', 'transactiontime', 'association_id']])
关键步骤解释
- 组标签生成:通过
groupby('user')对每个用户单独处理,(x > 14).cumsum()会在每次相邻交易间隔超过14天时,将组号加1,从而把同一用户内连续14天内的交易归为同一组。 - 随机ID分配:先提取所有唯一的
(user, group_tag)组合,再为每个组合生成独立的uuid,避免了一次性生成导致的ID重复问题。
结果示例
运行后你会看到:
- Michael的3行交易属于同一组,共用一个
association_id - Tom的交易分为3组:前2行一组、中间2行一组、最后1行单独一组,每组对应不同的
association_id
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

