鉴于我有以下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中执行上述过滤,如果可能的话,它会比上面更快吗?
过滤的标准是:
other
以及food
或drink
答案 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