【问题标题】:replace method raises error TypeError: unhashable type: 'list' [duplicate]替换方法引发错误类型错误:不可散列的类型:“列表”[重复]
【发布时间】:2018-08-07 16:01:52
【问题描述】:

我有一个对象,我想用其他值替换其中的某些值。

replacements = {
['object','timedelta[ns]']: 'varchar',
'float64': 'float',
'int64': 'int',
'datetime64': 'timestamp'
}

当我尝试运行TypeError: unhashable type: 'list'上方的命令时出现错误

我想让replacements 输入dataframe.dtypes.replace(replacements)

编辑: 添加 () 使其可散列:('object','timedelta[ns]'): 'varchar',

但现在收到此错误:

TypeError: Cannot compare types 'ndarray(dtype=object)' and 'tuple'

如果我删除 ('object','timedelta[ns]'): 'varchar', 任何想法,这不是问题吗?

【问题讨论】:

  • 因为['object','timedelta[ns]'] 不能是字典中的键,所以它是一个列表(不可散列)。这与replace 无关。
  • 一旦它是可散列的,我得到另一个错误,说我无法比较类型。但是如果我注释掉元组,这个错误就会消失。知道为什么会这样吗?
  • 我猜猜你应该有单键:值对:{'object': 'varchar', 'timedelta[ns]': 'varchar', ...} 但我不能确定
  • 使用timedelta64[ns]。请参阅我的更新答案。
  • 将它们分解为单个键值对会给我这个错误(TypeError:无法比较类型'ndarray(dtype = object)'和'str')。它仅适用于 timedelta[ns] 字符串。看起来字符串中的 [] 可能有问题

标签: python pandas


【解决方案1】:

您需要将键设为元组以使其可散列:

replacements = {
('object','timedelta64[ns]'): 'varchar',
'float64': 'float',
'int64': 'int',
'datetime64': 'timestamp'
}

此外,您需要使用timedelta64[ns],而不仅仅是timedelta[ns],因为您只能使用实际代表现有数据类型的字符串。 timedelta64[ns] 类型来自 NumPy,其名称与此完全相同。

【讨论】:

  • 有效...不知道为什么 timedelta[ns] 无效但 timedelta64[ns] 有效?
  • 它不将其识别为数据类型并将其视为字符串。
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多