为什么将列表作为值而不是列的索引是可以的?

时间:2017-06-29 23:54:59

标签: python pandas numpy

考虑numpy.array i

i = np.empty((1,), dtype=object)
i[0] = [1, 2]

i

array([list([1, 2])], dtype=object)

示例1
index

df = pd.DataFrame([1], index=i)
df

        0
[1, 2]  1

示例2
columns

df = pd.DataFrame([1], columns=i)

当我显示它时会导致这种情况

df
TypeError: unhashable type: 'list'

然而,df.T有效!?

问题
为什么索引值必须在列上下文中是可清除的,而不是在索引上下文中?为什么只有当它显示出来?

2 个答案:

答案 0 :(得分:1)

这是因为熊猫内部如何确定DataFrame对象的字符串表示形式。从本质上讲,这里的列标签和索引标签之间的区别在于,该列确定字符串表示形式的格式(因为该列可以是float,int等)。

由于熊猫为字典中的每一列存储了一个单独的格式化程序对象,并且使用列名来检索此对象,因此发生了错误。具体来说,触发错误的行是https://github.com/pandas-dev/pandas/blob/d1accd032b648c9affd6dce1f81feb9c99422483/pandas/io/formats/format.py#L420

答案 1 :(得分:-1)

“unhashable type”错误通常意味着在这种情况下类型列表是可变的。可变类型不可清除,因为它们可能在生成哈希代码后发生更改。发生这种情况是因为您尝试使用列表作为键来检索项目,但由于密钥必须是可清除的,因此检索失败。