python中带有字符串列表的列

Posted

技术标签:

【中文标题】python中带有字符串列表的列【英文标题】:Column with list of strings in python 【发布时间】:2013-10-21 12:17:23 【问题描述】:

我有一个如下所示的 pandas 数据框:

                                          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'

我不太清楚这个错误意味着什么,因为我对 pandas 很陌生。请让我知道如何实现从 dataFrame 中仅提取那些行的目标,其中该行的“categories”列将字符串“Restaurants”作为 categories_list 的一部分。 任何帮助将不胜感激。

提前致谢!

【问题讨论】:

“unhashable type”错误通常意味着类型(在这种情况下为 list)是可变的。可变类型不可散列,因为它们在生成散列码后可能会发生变化。发生这种情况是因为您尝试使用列表作为键来检索项目,但由于键必须是可散列的,因此检索失败。 【参考方案1】:

我认为您可能必须为此使用 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】:

好的,所以我一直试图找出这个问题的答案已经有一段时间了,但结果是空的(基本上没有编写一个小的递归程序来扩展列表),我认为这是因为,起初无论如何,你想要做的事情并不是那么有效(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 的解决方案,看起来不错,但它是开发分支,仅供参考。

【讨论】:

【参考方案3】:

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

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

文档pandas.DataFrame.query

【讨论】:

与今天一样,这会给出TypeError: unhashable type: 'list' 错误。

以上是关于python中带有字符串列表的列的主要内容,如果未能解决你的问题,请参考以下文章

数据表:标题中带有点 (.) 的列未正确显示

.NetCore HttpWebRequest GET 中带有查询的字符串列表

python-3.6中带有'f'前缀的字符串

SwiftUI 中带有文本字段的长列表

where 子句中带有字符的整数字段返回奇怪的输出

Python中带有AND条件的LOC搜索字符串