如何根据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