2016-02-11 101 views
3

我有一个超过10万行的dF和几列宽 - 没有什么疯狂的。我试图根据大约4000个字符串的列表对行进行子集划分,但我正在努力弄清楚如何这样做。有没有一种方法来使用类似的子集。如何基于字符串值列表对熊猫数据框进行分类?

东风看起来像这样

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'

我检查了similar questiondocsthis的子集数据通过查看列表中是否存在某个值,但是这让我无所适从,而且我对我所缺少的东西有些困惑。非常感谢别人的建议!

+0

检查'dog_name'列中是否有任何列表:'any((在df.dog_name中v的isinstance(v,list)))' – Alexander

+0

您的命令是正确的,可能是Alexander指出的一个数据问题。 –

回答

3

我相信你的狗名列中有一个列表。

这工作得很好:

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

但是,如果你添加一个列表:

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} 
+0

嗯,这真的很奇怪。 @Alexander,足够奇怪'任何((在df.dog_name中为(isinstance(v,list)for v))''''false' – scrollex

+1

尝试确保数据是所有字符串:'all((isinstance(dog,str)for dog在df.dog_name))' – Alexander

+0

完美,谢谢! – scrollex

相关问题