2017-02-22 5 views
1

Учитывая У меня есть следующий файл CSV data.csv:В pandas, как мне выполнить фильтрацию на объекте DataframeGroupBy?

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 

Я хочу, чтобы сгруппировать данные по (цена, 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, и если это возможно, будет ли она быстрее, чем указано выше?

Критерии для фильтрации является:

  • размера группы больше, чем 1
  • группы данных должна содержать категорию other и по меньшей мере один из обоего food или drink

ответ

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 
Смежные вопросы