考虑数据框df
df = pd.DataFrame({
1: [1, 2],
2: ['a', 3],
3: [None, 7]
})
df
1 2 3
0 1 a NaN
1 2 3 7.0
当我与字符串
比较时df == 'a'
TypeError: Could not compare ['a'] with block values
然而,采用转置修复了问题?!
(df.T == 'a').T
1 2 3
0 False True False
1 False False False
这是什么错误?我可以通过如何构建数据帧来解决这个问题吗?与转置相比有什么不同?
答案 0 :(得分:4)
创建数据框时,请声明dtype=object
:
In [1013]: df = pd.DataFrame({
...: 1: [1, 2],
...: 2: ['a', 3],
...: 3: [None, 7]
...: }, dtype=object)
In [1014]: df
Out[1014]:
1 2 3
0 1 a None
1 2 3 7
现在,您可以在没有换位的情况下进行比较:
In [1015]: df == 'a'
Out[1015]:
1 2 3
0 False True False
1 False False False
我的信念是,首先,您的列不是对象(它们会尽可能地被强制转换),但由于混合值,转置会强制更改。
在源代码pandas/internals.py
中找到了这个:
if not isinstance(result, np.ndarray):
# differentiate between an invalid ndarray-ndarray comparison
# and an invalid type comparison
...
raise TypeError('Could not compare [%s] with block values' %
repr(other))
如果要比较的项与数组的dtype不匹配,则抛出此错误。