代码之家  ›  专栏  ›  技术社区  ›  SarahData

处理大量行(pandas dataframe)以根据条件筛选行

  •  1
  • SarahData  · 技术社区  · 6 年前

    我有一个包含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 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    样品 :

    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