【问题标题】:df ['X'].unique() and TypeError: unhashable type: 'numpy.ndarray'df ['X'].unique() 和 TypeError: unhashable type: 'numpy.ndarray'
【发布时间】:2020-03-24 01:21:41
【问题描述】:

所有,

我在数据框中有一列如下所示:

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'

我在分组时也遇到错误。

欢迎任何帮助。谢谢

【问题讨论】:

  • 你的单元格包含 np.array
  • 您能否在您的“BrokerMixed”列中显示一个简短的整体数据框示例?
  • 你能显示print allHoldingsFund.loc[78, 'BrokerMixed']的输出吗
  • @Sahil allHoldingsFund.loc[78, 'BrokerMixed'] Out[422]: array('ML', dtype='<U2')
  • @user2906838 挺大的

标签: python pandas group-by


【解决方案1】:

看起来您的系列中有一个 NumPy 数组。但是你不能对 NumPy 数组进行哈希处理,而 pd.Series.uniqueset 一样,依赖于哈希处理。

如果您不能确保您的系列数据仅包含字符串,您可以在调用 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 数组是对象
【解决方案2】:

您的数据列中有一个数组,您可以尝试以下操作

allHoldingsFund['BrokerMixed'].apply(lambda x: str(x)).unique()

【讨论】:

  • 你得到什么错误?你能回答我对你的问题的评论吗?
  • File "pandas/_libs/hashtable_class_helper.pxi", line 1340, in pandas._libs.hashtable.PyObjectHashTable.unique TypeError: unhashable type: 'numpy.ndarray'
  • 错误AttributeError: 'StringMethods' object has no attribute 'unique'
  • 我只能建议你查看变量a=allHoldingsFund.loc[78, 'BrokerMixed'] 并尝试将其转换为字符串,然后将函数应用于您的列并获取唯一值。
【解决方案3】:

首先我建议你检查一下你的column 中的type 是什么。你可以尝试如下

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

如果这是dataframe series,你可以试试

allHoldingsFund['BrokerMixed'].reset_index()['BrokerMixed'].unique()

并检查这是否适合您。

EDIT 2020 :使用 Python 3 获得独特和提及的答案的方法可以获取相同的结果

【讨论】:

  • 谢谢 Harry_pb type(allHoldingsFund['BrokerMixed']) Out[423]: pandas.core.series.Series 你的代码 allHoldingsFund['BrokerMixed'].reset_index()['BrokerMixed'].unique() 给出了一个错误。请问如何摆脱数组并使整个列成为对象?
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多