Фильтрация кадра данных pandas путем агрегирования по двум столбцам - PullRequest
1 голос
/ 18 января 2020

У меня есть pandas фрейм данных. Вот первые пять строк:

      InvoiceNo StockCode                          Description  Quantity      InvoiceDate       UnitPrice  CustomerID         Country  
    0    536365    85123A   WHITE HANGING HEART T-LIGHT HOLDER         6   2010-12-01 08:26:00       2.55     17850.0  United Kingdom  
    1    536365     71053                  WHITE METAL LANTERN         6   2010-12-01 08:26:00       3.39     17850.0  United Kingdom
    2    536365    84406B       CREAM CUPID HEARTS COAT HANGER         8   2010-12-01 08:26:00       2.75     17850.0  United Kingdom
    3    536365    84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6   2010-12-01 08:26:00       3.39     17850.0  United Kingdom
    4    536365    84029E       RED WOOLLY HOTTIE WHITE HEART.         6   2010-12-01 08:26:00       3.39     17850.0  United Kingdom

Я бы хотел сгруппировать по StockCode и CustomerID и сумме Quantity. Затем я хотел бы выбросить все пары StockCode / CustomerID, где эта сумма отрицательна. Желаемым конечным продуктом является исходный кадр данных с удаленными строками, соответствующими этим парам StockCode / CustomerID.

У меня есть рабочее решение:

retail_df.groupby(['CustomerID','StockCode']).filter(lambda x: x['Quantity'].sum() >= 0)

Однако моему ноутбуку требуется четыре минуты, чтобы запустить его. Есть 406829 строк. Есть ли более быстрый способ?

1 Ответ

1 голос
/ 18 января 2020

Это должно сработать:

df2=retail_df.groupby(['CustomerID','StockCode'])["Quantity"].sum().ge(0)

retail_df=retail_df.set_index(['CustomerID','StockCode']).loc[df2.loc[df2].index].reset_index(drop=False)
...