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',我想了解为什么以及如何解决。
答案 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',)]