转换Dataframe列以解决TypeError无法进行哈希处理

时间:2018-03-07 14:21:36

标签: python python-3.x pandas

这个问题在SO上已被多次询问,但在每种情况下我都发现答案总是改变OP的代码以不同的方式获得正确的结果。 Example Example

如何将数据帧列转换为可以散列的内容,而不是使用不同的方法来解决问题?或者,如果不可能,为什么还要使用其他方法呢?

import pandas as pd

d = {'name':['bil','bil','bil','jim'],
     'col2': ['acct','law', 'acct2','law'],
     'col3': [1,2,3,55],
     'col4': [1,1,1,2]

    }
df2 = pd.DataFrame(data=d)
coursesFilter=['acct']

print(df2[df2['col2'].isin([coursesFilter])]) #TypeError: unhashable type: 'list'
print(df2[df2['col2'].isin([pd.Series(coursesFilter)])]) #TypeError: 'Series' objects are mutable, thus they cannot be hashed
print(df2[df2['col2'].isin([pd.Series(coursesFilter).tolist()])]) #TypeError: unhashable type: 'list'

2 个答案:

答案 0 :(得分:2)

我认为需要删除[]

print(df2[df2['col2'].isin(coursesFilter)])
print(df2[df2['col2'].isin(pd.Series(coursesFilter))])
print(df2[df2['col2'].isin(pd.Series(coursesFilter).tolist())])

输入Series.isin参数:

  

值:set或list-like

     

要测试的值序列。传入单个字符串会引发TypeError。相反,将单个字符串转换为一个元素的列表。

答案 1 :(得分:1)

您的coursesFilter已经是列表对象,不需要添加[]

df2[df2['col2'].isin(coursesFilter)]
Out[410]: 
   col2  col3  col4 name
0  acct     1     1  bil