【问题标题】:Merge two dataframes and create new features based on aggregations合并两个数据框并基于聚合创建新功能
【发布时间】:2019-11-29 21:27:28
【问题描述】:

我有两个数据框 df_cust(客户数据,大约 250k 行)和 df_trx(交易,大约 14mio 行)。我想根据 df_trx 中的聚合(总和、最大值、最小值)在 df_cust 中创建新功能。如果客户购买了商品 A、B 或 C,我也会尝试创建新的虚拟功能。

合并两个数据框没问题,但我不知道如何创建新功能。

非常感谢任何有用的建议

样本数据:

import pandas as pd

df_cust = pd.DataFrame({'CUST_ID': [1, 2, 3, 4],
                    'GENDER':  [1, 0, 0, 0]})

df_trx = pd.DataFrame({'CUST_ID': [1, 4, 4, 2, 2, 4, 1],
                   'AMOUNT':  [16, 89, 240, 20, 1303, 39, 2],
                   'DATE': ['2018-12-06', '2018-12-12', '2019-04-06', '2018-10-23', '2018-12-06', '2019-05-09', '2019-05-29'],
                   'ITEM': ['A', 'C', 'C', 'B', 'A', 'A', 'A']})

预期结果:

df_cust_merged = pd.DataFrame({'CUST_ID': [1, 2, 3, 4],
                           'GENDER':  [1, 0, 0, 0],
                           'AMOUNT_SUM': [18, 1323, 'NaN', 368],
                           'AMOUNT_MAX': [16, 1303, 'NaN', 240],
                           'AMOUNT_MIN': [2, 20, 'NaN', 39],
                           'FIRST_TRX': ['2018-12-06', '2018-10-23', 'NaN', '2018-12-12'],
                           'LAST_TRX': ['2019-05-29', '2018-12-06', 'NaN', '2019-05-09'],
                           'HAS_ITEM_A': [1, 1, 0, 1],
                           'HAS_ITEM_B': [0, 1, 0, 0],
                           'HAS_ITEM_C': [0, 0, 0, 1]})

【问题讨论】:

    标签: python pandas dataframe merge aggregation


    【解决方案1】:

    首先我们使用outer merge 来收集数据。

    然后我们GroupBy.agg具有多种功能:meansummaxminfirstlast

    然后我们使用pd.crosstab 来获取您的HAS_ITEM 列(基本上是单热编码)。

    mrg1 = df_cust.merge(df_trx, on='CUST_ID', how='outer')
    
    mrg = mrg1.groupby('CUST_ID').agg({'GENDER':'mean',
                                       'AMOUNT':['sum', 'max', 'min'],
                                       'DATE':['first', 'last']})
    
    mrg.columns = ['_'.join(col) for col in mrg.columns]
    
    mrg = mrg.join(pd.crosstab(mrg1['CUST_ID'], mrg1['ITEM'], dropna=False).add_prefix('HAS_ITEM_')).reset_index()
    

    输出

       CUST_ID  GENDER_mean  AMOUNT_sum  AMOUNT_max  AMOUNT_min  DATE_first   DATE_last  HAS_ITEM_A  HAS_ITEM_B  HAS_ITEM_C
    0        1            1        18.0        16.0         2.0  2018-12-06  2019-05-29         2.0         0.0         0.0
    1        2            0      1323.0      1303.0        20.0  2018-10-23  2018-12-06         1.0         1.0         0.0
    2        3            0         0.0         NaN         NaN         NaN         NaN         NaN         NaN         NaN
    3        4            0       368.0       240.0        39.0  2018-12-12  2019-05-09         1.0         0.0         2.0
    

    【讨论】:

    • 谢谢尔凡,工作就像一个魅力。对于 HAS_ITEM 列,我在考虑 1 或 0(单热编码),但 count 也可能很好用。我会看看什么能带来最好的结果。
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2018-01-30
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多