You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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']])

关键步骤解释

  1. 组标签生成:通过groupby('user')对每个用户单独处理,(x > 14).cumsum()会在每次相邻交易间隔超过14天时,将组号加1,从而把同一用户内连续14天内的交易归为同一组。
  2. 随机ID分配:先提取所有唯一的(user, group_tag)组合,再为每个组合生成独立的uuid,避免了一次性生成导致的ID重复问题。

结果示例

运行后你会看到:

  • Michael的3行交易属于同一组,共用一个association_id
  • Tom的交易分为3组:前2行一组、中间2行一组、最后1行单独一组,每组对应不同的association_id

内容的提问来源于stack exchange,提问作者Jacky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:55:20