如何基于字符串值列表对Pandas数据框进行子集筛选?

13

我有一份超过100k行、几列宽的数据框 dF,没有什么太疯狂的东西。我试图根据一个包含约4000个字符串的列表来对行进行子集筛选,但是我很难想出如何实现。是否有一种可以使用类似于...的方法进行子集筛选的方式呢?

dF的外观类似于这样:

dog_name    count
===================
Jenny        2
Fido         4
Joey         7
Yeller       2

字符串列表包含变量dog_name_list=['Fido', 'Yeller']

我尝试了类似于df[df['dog_name'].isin(dog_name_list)的方法,但是出现了一个错误:unhashable type: 'list'

我查看了类似问题文档此篇文章,这些都无法帮助我解决问题。我有点困惑,不知道自己缺少了什么。真的很感激有人能给我建议!


检查您的 dog_name 列中是否有任何列表:any((isinstance(v, list) for v in df.dog_name)) - Alexander
您的命令是正确的,很可能是数据问题,就像 Alexander 所指出的那样。 - Def_Os
1个回答

13

我相信你在狗名列里有一个列表。

这个工作很好:

>>> df[df['dog_name'].isin({'Fido', 'Yeller'})]
  dog_name  count
1     Fido      4
3   Yeller      2

但如果你其中一只狗的名字是列表而不是字符串,你将会得到一个TypeError: unhashable type: 'list'

df.ix[4] = (['a'], 2)
>>> df
  dog_name  count
0    Jenny      2
1     Fido      4
2     Joey      7
3   Yeller      2
4      [a]      2

>>> df[df['dog_name'].isin({'Fido', 'Yeller'})]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-1b68dd948f39> in <module>()
----> 1 df[df['dog_name'].isin({'Fido', 'Yeller'})]
...
pandas/lib.pyx in pandas.lib.ismember (pandas/lib.c:5014)()

TypeError: unhashable type: 'list'

找到那些坏狗:

>>> df[[isinstance(dog, list) for dog in df.dog_name]]
  dog_name  count
4      [a]      2

查找列中的所有数据类型:

>>> set((type(dog) for dog in df.dog_name))
{list, str}

嗯,这真的很奇怪。@Alexander,有趣的是,any((isinstance(v, list) for v in df.dog_name)) 返回了 false - scrollex
2
尝试确保数据全部为字符串:all((isinstance(dog, str) for dog in df.dog_name)) - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接