列中包含python中的字符串列表

时间:2013-10-13 23:51:22

标签: python pandas slice dataframe

我有一个像下面这样的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的一部分。 任何帮助将不胜感激。

提前致谢!

3 个答案:

答案 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)

我认为在pandas 0.12中你可以做以下事情:

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

pandas.DataFrame.query

的文档