处理大量行(pandas数据框)以根据条件过滤行

时间:2018-08-03 10:39:31

标签: python-2.7 pandas group-by

我有一个包含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)]

最后一行需要很多时间才能完成。有更好的方法吗?

谢谢。

1 个答案:

答案 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 indexingtransform用于返回相同的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