df['X'].unique() 和 TypeError: unhashable type: 'numpy.ndarray'

7

大家好,

我在一个数据框中有一列数据,它看起来像这样:

allHoldingsFund['BrokerMixed']
Out[419]: 
78         ML
81       CITI
92         ML
173      CITI
235        ML
262        ML
264        ML
25617      GS
25621    CITI
25644    CITI
25723      GS
25778    CITI
25786    CITI
25793      GS
25797    CITI
Name: BrokerMixed, Length: 2554, dtype: object

虽然列是一个对象,但我无法按照该列进行分组,甚至无法提取该列的唯一值。例如,当我执行以下操作时:

allHoldingsFund['BrokerMixed'].unique()

我遇到了一个错误。
     uniques = table.unique(values)
  File "pandas/_libs/hashtable_class_helper.pxi", line 1340, in pandas._libs.hashtable.PyObjectHashTable.unique
TypeError: unhashable type: 'numpy.ndarray'

当我使用group by时也遇到了错误。

欢迎任何帮助。谢谢。


1
你有一个单元格包含np.array。 - BENY
请问您能否展示一下包含“BrokerMixed”列的数据框的简短样本? - user2906838
你能展示一下 print allHoldingsFund.loc[78, 'BrokerMixed'] 的输出吗? - Sahil Puri
@Sahil allHoldingsFund.loc[78, 'BrokerMixed'] Out[422]: array('ML', dtype='<U2') - SBad
@user2906838 这很大。 - SBad
尝试运行 print allHoldingsFund.loc[78, 'BrokerMixed'][0]print type(allHoldingsFund.loc[78, 'BrokerMixed'][0]) - Sahil Puri
3个回答

5
您的数据列中有一个数组,您可以尝试以下操作:
allHoldingsFund['BrokerMixed'].apply(lambda x: str(x)).unique()

你得到了什么错误信息?你能回答一下我在你的问题上的评论吗? - Sahil Puri
File "pandas/_libs/hashtable_class_helper.pxi", line 1340, in pandas._libs.hashtable.PyObjectHashTable.unique TypeError: unhashable type: 'numpy.ndarray' - SBad
错误 AttributeError: 'StringMethods' 对象没有属性 'unique' - SBad
1
我只能建议您查看变量a=allHoldingsFund.loc[78, 'BrokerMixed'],尝试将其转换为字符串,然后将该函数应用于您的列并获取唯一值。 - Sahil Puri

5

看起来你的系列中有一个NumPy数组。但是你不能哈希NumPy数组,而且像set一样,pd.Series.unique也依赖于哈希。

如果你无法确保系列数据仅包含字符串,则在调用pd.Series.unique之前可以将NumPy数组转换为元组:

s = pd.Series([np.array([1, 2, 3]), 1, 'hello', 'test', 1, 'test'])

def tuplizer(x):
    return tuple(x) if isinstance(x, (np.ndarray, list)) else x

res = s.apply(tuplizer).unique()

print(res)

array([(1, 2, 3), 1, 'hello', 'test'], dtype=object)

当然,这意味着您的数据类型信息在结果中丢失了,但至少您可以看到您的“独特”的NumPy数组,前提是它们是一维的。

谢谢 jpp,我想我会进行一些代码更改以确保该列仅为对象,而不是对象和数组的混合。 - SBad
@SBad 数组 是对象 - juanpa.arrivillaga

0

首先建议您检查您的类型。您可以尝试以下操作:

print (type(allHoldingsFund['BrokerMixed']))

如果这是一个“数据帧系列”,你可以尝试
allHoldingsFund['BrokerMixed'].reset_index()['BrokerMixed'].unique()

请尝试并检查是否适用于您。

编辑2020:使用Python 3获取唯一和提到的答案的方法会产生相同的结果。

enter image description here


谢谢 Harry_pb。type(allHoldingsFund['BrokerMixed'])的输出结果为pandas.core.series.Series。您提供的代码allHoldingsFund['BrokerMixed'].reset_index()['BrokerMixed'].unique()出现了错误。请问如何去掉数组并将整个列变成对象呢? - SBad

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