KeyError:pandas数据帧中的False

时间:2017-07-02 21:31:12

标签: python pandas

import pandas as pd

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

我想在categories列中删除没有Restaurants的行,这列有列表,但是给出了错误'KeyError:False',我想了解为什么以及如何解决。

5 个答案:

答案 0 :(得分:8)

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

你要做的是一个叫做布尔索引的东西,就像这样。

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

答案 1 :(得分:1)

我认为你的意思是:

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

只保留带有类别餐馆的行

答案 2 :(得分:1)

如果您发现您的数据包含拼写版本或其他与餐馆相关的字词,则以下内容可能会带来好处。基本上,您将与餐馆相关的条款放在restuarant_lst中。如果lambda中的任何项目包含在业务系列的每一行中,true函数将返回restaurant_lst.loc索引器会过滤掉false函数返回lambda的行。

restaurant_lst = ['Restaurant','restaurantes','diner','bistro']
restaurant = businesses.loc[businesses.apply(lambda x: any(restaurant_str in x for restaurant_str in restaurant_lst))]

答案 3 :(得分:1)

这样做的原因是 Series 类实现了一个自定义的 in 运算符,该运算符不会像 iterable 那样返回 ==,这是一种解决方法

businesses[['Restaurants' in c for c in list(businesses['categories'])]]

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

答案 4 :(得分:0)

这里没有答案实际上对我有用,

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

由于“类别”中的值不是字符串,而是列表,因此显然无法正常工作。

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

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

这允许您使用标准的.loc内容:

businesses.loc[businesses['categories'] == ('Restaurants',)]