【发布时间】:2020-11-28 09:47:24
【问题描述】:
我有这个庞大的消费者交易数据集(1 亿行),如下所示:
df = pd.DataFrame({'id':[1, 1, 2, 2, 3],'brand':['a','b','a','a','c'], 'date': ['01-01-2020', '01-02-2020', '01-05-2019', '01-06-2019', '01-12-2018']})
对于每一行(每笔交易),我想检查是否同一个人(相同的“id”)过去为一个不同的品牌购买过东西。生成的数据集应如下所示:
id brand date check
0 1 a 01-01-2020 0
1 1 b 01-02-2020 1
2 2 a 01-05-2019 0
3 2 a 01-06-2019 0
4 3 c 01-12-2018 0
现在,我的解决方案是:
def past_transaction(row):
x = df[(df['id'] == row['id']) & (df['brand'] != row['brand']) & (df['date'] < row['date'])]
if x.shape[0]>0:
return 1
else:
return 0
df['check'] = df.appy(past_transaction, axis=1)
这很好用,但性能很差。有没有更有效的方法来做到这一点(有或没有熊猫)?谢谢!
【问题讨论】:
-
首先,您使用
apply的核心功能将使性能比现在快100 倍。其次,pandas 不适用于大数据工作流。将其放入 SQL 数据库并在您的键列上添加索引或使用类似spark或dask