我有一个数据框,如下所示:
business_id stars categories
0 abcd 4.0 ['Nightlife']
1 abcd1 3.5 ['Pizza', 'Restaurants']
2 abcd2 4.5 ['Groceries', 'Food']
我想根据类别列中存在的值过滤数据框。我的数据框大约有 400 000 行,我只想要其中包含类别“食品”或“餐厅”的行。
我尝试了很多方法,包括:
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)
但这显然是非常非常糟糕的方法,因为我在 400 000 行上使用 itertuples,并且我的系统继续处理无限长的时间。
我还尝试在 df[df['categories']]
中使用列表理解。但不能,因为它们都像 df[df['stars']==4.0]
一样进行过滤。甚至我看到的所有 apply()
方法都是针对列中具有单个值的列实现的。
那么,如何使用相当快速的迭代行实现对数据帧进行子集化,同时仅选择类别中包含“食品”或“餐厅”的行?
最佳答案
您可以在类别列上使用 apply
方法,检查每个元素是否包含 Food
或 Restaurants
,并据此创建逻辑用于子集化的索引数组:
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
关于python - 如何根据Python中列的行列表中存在的值来过滤数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032524/