合并两个数据框并基于聚合创建新功能
Merge two dataframes and create new features based on aggregations
我有两个数据帧 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]})
首先我们做一个outer merge
来收集数据。
然后我们GroupBy.agg
有多个函数:mean
、sum
、max
、min
、first
、last
.
然后我们使用 pd.crosstab
来获取您的 HAS_ITEM
列(基本上是 one-hot-encoding)。
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
我有两个数据帧 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]})
首先我们做一个outer merge
来收集数据。
然后我们GroupBy.agg
有多个函数:mean
、sum
、max
、min
、first
、last
.
然后我们使用 pd.crosstab
来获取您的 HAS_ITEM
列(基本上是 one-hot-encoding)。
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