13

我有一个熊猫数据框,如下所示:

                                          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'

我不太清楚这个错误意味着什么,因为我对熊猫很陌生。请让我知道如何实现从数据帧中仅提取那些行的目标,其中该行的“类别”列将字符串“餐厅”作为类别列表的一部分。任何帮助将非常感激。

提前致谢!

4

3 回答 3

14

我认为您可能必须为此使用一个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
于 2013-10-14T04:36:10.963 回答
2

好的,所以我一直试图找出这个问题的答案已经有一段时间了,但结果是空的(基本上没有编写一个小的递归程序来扩展列表),我认为这是因为,无论如何,乍一看,您尝试做的事情并不是那么有效(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,但是这一次命中(对于现有数据)对于您使用 pandas 分析所获得的收益可能是值得的结果数据框。

Wes 的 Python for Data Analysis 一书中有一节称为“计算指标/虚拟变量”(大约在第 330 页左右),这对于此类操作来说是一个很好的资源。

抱歉,这并不能真正回答您的问题,我当然不知道它有多可行,但除此之外,您可以尝试 rtrwalker 的解决方案,它看起来不错,但它是开发分支,仅供参考。

于 2013-10-14T03:54:41.700 回答
1

我认为在 pandas0.12 中您可以执行以下操作:

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

pandas.DataFrame.query上的文档

于 2013-10-14T01:13:49.427 回答