【问题标题】:How to assign random IDs conditionally in pandas?如何在熊猫中有条件地分配随机 ID?
【发布时间】:2022-11-17 04:29:14
【问题描述】:

Python 的新手,我正在努力解决将一些随机 ID 分配给“相关”行的问题 其中关系只是他们在连续几天内按用户分组的接近度(在 14 天内)。

        import pandas as pd
        import uuid
        import numpy as np

这是一个虚拟数据框:

        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(["2022-01-01", 
                                                                "2022-01-02", 
                                                                "2022-01-03", 
                                                                "2022-09-01", 
                                                                "2022-09-13",
                                                                "2022-10-17",
                                                                "2022-10-20",
                                                                "2022-11-17"])})
        dummy_df.head(10)
        
        transactionid   user    transactiontime
                0   1   michael 2022-01-01
                1   2   michael 2022-01-02
                2   3   michael 2022-01-03
                3   4   tom     2022-09-01
                4   5   tom     2022-09-13
                5   6   tom     2022-10-17
                6   7   tom     2022-10-20
                7   8   tom     2022-11-17

在这里,我对交易进行排序并计算它们的天数差异:

        dummy_df = dummy_df.assign(
            timediff = dummy_df
            .sort_values('transactiontime')
            .groupby(["user"])['transactiontime'].diff() / np.timedelta64(1, 'D')
            ).fillna(0)
        
        dummy_df.head(10)
        
        
        transactionid   user    transactiontime timediff
                0   1   michael 2022-01-01  0.0
                1   2   michael 2022-01-02  1.0
                2   3   michael 2022-01-03  1.0
                3   4   tom     2022-09-01  0.0
                4   5   tom     2022-09-13  12.0
                5   6   tom     2022-10-17  34.0
                6   7   tom     2022-10-20  3.0
                7   8   tom     2022-11-17  28.0

在这里,我为每个相关交易创建了一个带有随机 ID 的新列 - 虽然它没有按预期工作:

        dummy_df.assign(related_transaction = np.where((dummy_df.timediff >= 0) & (dummy_df.timediff < 15), uuid.uuid4(), dummy_df.transactionid))
        
        
        transactionid   user    transactiontime timediff    related_transaction
                0   1   michael 2022-01-01  0.0  fd630f07-6564-4773-aff9-44ecb1e4211d
                1   2   michael 2022-01-02  1.0  fd630f07-6564-4773-aff9-44ecb1e4211d
                2   3   michael 2022-01-03  1.0  fd630f07-6564-4773-aff9-44ecb1e4211d
                3   4   tom     2022-09-01  0.0  fd630f07-6564-4773-aff9-44ecb1e4211d
                4   5   tom     2022-09-13  12.0 fd630f07-6564-4773-aff9-44ecb1e4211d
                5   6   tom     2022-10-17  34.0    6
                6   7   tom     2022-10-20  3.0  fd630f07-6564-4773-aff9-44ecb1e4211d
                7   8   tom     2022-11-17  28.0    8

我期望的是假设交易之间的用户组差异在 14 天内:

        transactionid   user    transactiontime timediff    related_transaction
                0   1   michael 2022-01-01  0.0  ad2a8f23-05a5-49b1-b45e-cbf3f0ba23ff
                1   2   michael 2022-01-02  1.0  ad2a8f23-05a5-49b1-b45e-cbf3f0ba23ff
                2   3   michael 2022-01-03  1.0  ad2a8f23-05a5-49b1-b45e-cbf3f0ba23ff
                3   4   tom     2022-09-01  0.0  b1da2251-7770-4756-8863-c82f90657542
                4   5   tom     2022-09-13  12.0 b1da2251-7770-4756-8863-c82f90657542
                5   6   tom     2022-10-17  34.0 485a8d97-80d1-4184-8fc8-99523f471527
                6   7   tom     2022-10-20  3.0  485a8d97-80d1-4184-8fc8-99523f471527
                7   8   tom     2022-11-17  28.0    8

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的代码与您想要的结果之间的不匹配是uuid.uuid4() 一次创建一个 ID 并将其分配给np.where() 定义的所有相关行。相反,您需要以矢量化方式生成 ID。

    尝试以下方法:

    df.loc[ROW_CONDITIONs, COLUMNS] = VECTORIZED_ID_GENERATOR
    

    对于你的例子来说是

    dummy_df.loc[(dummy_df['timediff'] >= 0) & (dummy_df['timediff'] < 15), 'related_transaction'] = dummy_df.apply(lambda _: uuid.uuid4(), axis=1)
    

    考虑到这只能解决您如何在 Pandas 中有条件地使用 uuid 分配随机 ID 的问题。在我看来,您还需要每 15 天为同一用户和交易生成相同的 ID。我的建议是生成一个数据框,其中每一行都是两个交易的组合,并添加一个条件,说明来自两个交易的用户必须相同。

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      相关资源
      最近更新 更多