我无法将数据帧与字符串进行比较!但我可以比较它的转置

时间:2017-07-27 17:16:12

标签: python pandas dataframe

考虑数据框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

这是什么错误?我可以通过如何构建数据帧来解决这个问题吗?与转置相比有什么不同?

1 个答案:

答案 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不匹配,则抛出此错误。