如何根据Python中列的行列表中的值过滤数据帧?

如何根据Python中列的行列表中的值过滤数据帧?,python,pandas,Python,Pandas,我有一个数据框,看起来像: business_id stars categories 0 abcd 4.0 ['Nightlife'] 1 abcd1 3.5 ['Pizza', 'Restaurants'] 2 abcd2 4.5 ['Groceries', 'Food'] 我想根据categories列中的值过滤数据帧。我的数据框大约有400000行,我只希望这些行中包含“食品”或“餐厅”类别 我尝试了很多方法,

我有一个数据框,看起来像:

   business_id  stars  categories
0  abcd         4.0    ['Nightlife']
1  abcd1        3.5    ['Pizza', 'Restaurants']
2  abcd2        4.5    ['Groceries', 'Food']
我想根据categories列中的值过滤数据帧。我的数据框大约有400000行,我只希望这些行中包含“食品”或“餐厅”类别

我尝试了很多方法,包括:

def foodie(x):
    for row in x.itertuples():
        if 'Food' in row[3] or 'Restaurant' in row[3]:
            return x

df = df.apply(foodie, axis=1)
但这显然是非常非常糟糕的方法,因为我在400000行上使用itertuples,并且我的系统将无限长时间地进行处理

我还尝试在
df[df['categories']]
中使用列表理解。但是不能,因为它们都像
df[df['stars']==4.0]
一样过滤。甚至我看到的所有
apply()
方法都是为列中只有一个值的列实现的


那么,我如何使用一个相当快速的实现对我的行进行迭代,同时只选择那些类别中有“食物”或“餐馆”的行,从而对我的数据帧进行子集划分呢

您可以使用分类列上的
应用
方法,检查每个元素是否包含
食品
餐厅
,并据此创建用于子集的逻辑索引数组:

df.loc[df.categories.apply(lambda cat: 'Food' in cat or 'Restaurants' in cat)]

#     business_id             categories      stars
# 1         abcd1   [Pizza, Restaurants]        3.5
# 2         abcd2      [Groceries, Food]        4.5

只是另一个想法。保留字符串而不是列表对象

In [2]: import pandas as pd

In [3]: data = {'business_id':['abcd','abcd1','abcd2'],'stars':    [4.0,3.5,4.5],'categories':[['Nightlife'],['Pizza', 'Restaurants'],['Groceries', 'Food']]}
# convert list to string with join() method
In [15]: df.categories = df.categories.apply(",".join)

In [16]: df 
Out[16]: 
  business_id         categories  stars
0        abcd          Nightlife    4.0
1       abcd1  Pizza,Restaurants    3.5
2       abcd2     Groceries,Food    4.5

In [26]: df.categories.str.contains('Food')
Out[26]: 
0    False
1    False
2     True
Name: categories, dtype: bool