我有一个包含171534行采购篮的大型数据集。在计算数据集包含的产品(84088个唯一产品)之间的相似度的过程中,我只想过滤购买次数不止一次的产品(31878个产品)。
这就是我所做的:
grouped_by_product = df_temp.groupby("basket")["event_data"].aggregate({'orders': 'count'}).reset_index()
grouped_by_product = grouped_by_product[grouped_by_product['orders'] > 1]
products_list = grouped_by_product['basket'].tolist()
#filter df_temp on only rows that contain a product purchased more than once
f_temp= df_temp[df_temp['basket'].isin(products_list)]
最后一行需要很多时间才能完成。有更好的方法吗?
谢谢。
答案 0 :(得分:2)
示例:
df_temp = pd.DataFrame({'event_data':[5,3,6,9,2,4,7],
'basket':list('abbbccd')})
print (df_temp)
event_data basket
0 5 a
1 3 b
2 6 b
3 9 b
4 2 c
5 4 c
6 7 d
通过count
进行过滤的一般解决方案是boolean indexing
和transform
用于返回相同的Series
聚合值,并且其大小与原始df
相同:
df = df_temp[df_temp.groupby("basket")["event_data"].transform('count') > 1]
print (df)
event_data basket
1 3 b
2 6 b
3 9 b
4 2 c
5 4 c
basket
列中的重复行使用duplicated
和参数kep=False
来返回所有重复项:
df = df_temp[df_temp.duplicated("basket", keep=False)]
print (df)
event_data basket
1 3 b
2 6 b
3 9 b
4 2 c
5 4 c