在pandas中,如何对DataframeGroupBy对象执行过滤?

时间:2017-02-22 19:14:48

标签: python pandas

鉴于我有以下csv data.csv

id,category,price,source_id
1,food,1.00,4
2,drink,1.00,4
3,food,5.00,10
4,food,6.00,10
5,other,2.00,7
6,other,1.00,4

我想按(price,source_id)对数据进行分组,我正在使用以下代码进行分组

import pandas as pd


df = pd.read_csv('data.csv', names=['id', 'category', 'price', 'source_id'])
grouped = df.groupby(['price', 'source_id'])
valid_categories = ['food', 'drink']
for price_source, group in grouped:
    if group.category.size < 2:
        continue

    categories = group.category.tolist()
    if 'other' in categories and len(set(categories).intersection(valid_categories)) > 0:
        pass
        """
        Valid data in this case is:

        1,food,1.00,4
        2,drink,1.00,4
        6,other,1.00,4

        I will need all of the above data including the id for other purposes
        """

是否有另一种方法可以在for循环之前在pandas中执行上述过滤,如果可能的话,它会比上面更快吗?

过滤的标准是:

  • 组的大小大于1
  • 按数据分组应包含类别other以及fooddrink
  • 中的至少一个

1 个答案:

答案 0 :(得分:0)

您可以直接将自定义过滤器应用于GroupBy对象,例如

crit = lambda x: all((x.size > 1, 
                      'other' in x.category.values, 
                      set(x.category) & {'food', 'drink'}))

df.groupby(['price', 'source_id']).filter(crit)    

<强>输出

  category  id  price  source_id
0     food   1    1.0          4
1    drink   2    1.0          4
5    other   6    1.0          4