2013-10-13 9 views
10

字符串列表我有一个熊猫数据帧类似如下:柱用蟒

          categories review_count 
0     [Burgers, Fast Food, Restaurants]   137 
1       [Steakhouses, Restaurants]   176 
2 [Food, Coffee & Tea, American (New), Restaurants]   390 
...           ....    ... 
...           ....    ... 
...           ....    ... 

从这个数据帧,我想仅提取那些行,其中,所述列表中的“类别”该行的列包含“餐厅”类别。我至今尝试过: df[[df.categories.isin('Restaurants'),review_count]],

因为我在dataFrame中还有其他列,所以我指定了我要提取的这两列。但我得到的错误:

TypeError: unhashable type: 'list' 

我不知道这个错误意味着什么,因为我对熊猫很新。请让我知道我如何才能实现从dataFrame中只提取那些行的目标,其中该行的'categories'列包含字符串'Restaurants'作为categories_list的一部分。 任何帮助将不胜感激。

在此先感谢!

+1

的 “unhashable类型” 错误通常意味着,在这种情况下,类型,列表是可变的。可变类型不可哈希,因为它们在生成哈希代码后可能会更改。发生这种情况是因为您尝试使用列表作为关键字检索项目,但由于关键字必须可哈希,因此检索失败。 –

回答

9

我想你可能必须使用一个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 
2

我想在pandas0.12你可以做这样的事情:在pandas.DataFrame.query

+0

就像今天一样,这给了'TypeError:不可能的类型:'list''错误。 – Zero

3

df.query('"Restaurants" in categories') 

文档,所以我一直在努力,现在找出一个答案相当长一段时间,但已经空了(没有基本写一个小的递归程序来扩大名单),我认为这是因为,无论如何,乍一看,你试图做的并不是那么高效(Jimmy C对列表的评论在这里,可变的点就在这一点上),而不是你在熊猫大部分时间都会这样做的方式。

更好,(我认为)更快的方式将存储您的嵌套列表的列值,这样你就会有:

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的书中有一节叫做“计算指标/虚拟变量”(大约第330页左右),这对于这类操作来说是一个很好的资源。

对不起,这并没有真正回答你的问题,我当然不知道它有多可行,但除此之外,你可以尝试rtrwalker的解决方案,看起来不错,但它是开发分支,只是FYI。