我有一个像下面这样的pandas数据框:
categories review_count
0 [Burgers, Fast Food, Restaurants] 137
1 [Steakhouses, Restaurants] 176
2 [Food, Coffee & Tea, American (New), Restaurants] 390
... .... ...
... .... ...
... .... ...
从这个dataFrame中,我想只提取那些行中'categories'列中的列表包含'Restaurants'类别的行。我到目前为止尝试过:
df[[df.categories.isin('Restaurants'),review_count]]
,
因为我在dataFrame中还有其他列,所以我指定了要提取的这两列。但是我得到了错误:
TypeError: unhashable type: 'list'
我不太清楚这个错误意味着什么,因为我对熊猫很新。请告诉我如何实现我的目标,即仅从dataFrame中提取那些行,其中该行的“categories”列具有字符串'Restaurants'作为categories_list的一部分。 任何帮助将不胜感激。
提前致谢!
答案 0 :(得分:12)
我认为您可能必须使用lambda
函数,因为您可以测试列isin
中的值是否为某个序列,但pandas
似乎没有提供用于测试列中序列是否包含某个值的函数:
import pandas as pd
categories = [['fast_food', 'restaurant'], ['coffee', 'cafe'], ['burger', 'restaurant']]
counts = [137, 176, 390]
df = pd.DataFrame({'categories': categories, 'review_count': counts})
# Show which rows contain 'restaurant'
df.categories.map(lambda x: 'restaurant' in x)
# Subset the dataframe using this:
df[df.categories.map(lambda x: 'restaurant' in x)]
输出:
Out[11]:
categories review_count
0 [fast_food, restaurant] 137
2 [burger, restaurant] 390
答案 1 :(得分:3)
好的,所以我一直试图找出答案已经有一段时间了,但是已经空了(基本上没有编写一个小的递归程序来扩展列表)而且我认为这是因为,起初无论如何,你想要做的事情并不是那么有效(Jimmy C关于这些列表的可变性的评论就在这里)并不是你在Pandas大部分时间都会这样做的方式。
更好的(我认为)更快的方法是将嵌套列表存储为列值,以便您拥有:
df
review_count Burgers Fast Food Restaurants Steakhouses Food CoffeeTea American (New)
0 137 True True True False False False False
1 176 False False True True False False False
2 390 False False True False True True True
显然,这将涉及编写一个python程序从嵌套列表中提取您的类别,然后将其导出到DataFrame,但这一次点击(对于现有数据)可能值得您使用中获得的大熊猫分析结果数据框。
Wes的数据分析Python中有一节称为“计算指示器/虚拟变量”(约330页左右),这对于这种操作来说是一个很好的资源。
抱歉,这并没有真正回答你的问题,我当然不知道它有多可行,但除此之外,你可以尝试rtrwalker的解决方案,看起来相当不错,但它是开发分支,只是FYI。
答案 2 :(得分:2)