Python KeyError:数据帧中为False

Python KeyError:数据帧中为False,python,pandas,Python,Pandas,我想删除categories列中没有餐馆的行,该列有列表,但是出现了错误'KeyError:False',我想了解原因和解决方法。Business['categories']中的表达式'Restaurants'返回布尔值False。这将传递给DataFrame业务的括号索引运算符,该业务不包含名为False的列,因此会引发KeyError 您希望做的是一种称为布尔索引的方法,其工作原理如下 import pandas as pd businesses = pd.read_json(busine

我想删除categories列中没有餐馆的行,该列有列表,但是出现了错误'KeyError:False',我想了解原因和解决方法。

Business['categories']中的表达式
'Restaurants'返回布尔值
False
。这将传递给DataFrame业务的括号索引运算符,该业务不包含名为False的列,因此会引发KeyError

您希望做的是一种称为布尔索引的方法,其工作原理如下

import pandas as pd

businesses = pd.read_json(businesses_filepath, lines=True, encoding='utf_8')
restaurantes = businesses['Restaurants' in businesses['categories']]

我想你的意思是:

businesses[businesses['categories'] == 'Restaurants']

这将只保留类别为restaurants的行

如果您发现您的数据包含拼写变化或其他与餐馆相关的术语,以下内容可能会有所帮助。基本上,您将与餐厅相关的术语放在了Restarant中。如果
restaurant_lst
中的任何项目包含在业务系列的每一行中,则
lambda
函数将返回
true
.loc
索引器为
lambda
函数过滤掉返回
false
的行

businesses = businesses.loc[businesses['categories'] == 'Restaurants']

这里没有一个答案对我有用

restaurant_lst = ['Restaurant','restaurantes','diner','bistro']
restaurant = businesses.loc[businesses.apply(lambda x: any(restaurant_str in x for restaurant_str in restaurant_lst))]
显然不起作用,因为“categories”中的值不是字符串,而是列表,这意味着比较总是失败的

然而,的作用是将列转换为元组而不是字符串:

businesses[businesses['categories'] == 'Restaurants']
这允许您使用标准的.loc内容:

businesses['categories'] = businesses['categories'].apply(tuple)

原因是
系列
类在
中实现了一个自定义的
操作符,它不会像
=
那样返回一个
iterable
,这里有一个解决方法

business[['Restaurants'在c中代表列表中的c(business['categories')]]

希望这有助于您在列中查找子字符串而不是完全匹配的人。

是一个计算结果为标量
False
(或
True
)的本机python表达式。
“餐厅”
不仅仅是一个类别吗?在这种情况下,您需要
企业[businesss.categories=='Restaurants']
businesses.loc[businesses['categories'] == ('Restaurants',)]