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

piR*_*red 6 python dataframe pandas

考虑数据帧 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
Run Code Online (Sandbox Code Playgroud)

当我与一个字符串比较

df == 'a'
Run Code Online (Sandbox Code Playgroud)
TypeError: Could not compare ['a'] with block values
Run Code Online (Sandbox Code Playgroud)

但是,采用转置修复了问题?!

(df.T == 'a').T

       1      2      3
0  False   True  False
1  False  False  False
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以在不转置的情况下进行比较:

In [1015]: df == 'a'
Out[1015]: 
       1      2      3
0  False   True  False
1  False  False  False
Run Code Online (Sandbox Code Playgroud)

我的信念是,首先,您的列不是对象(它们在可能的情况下被强制),但由于混合值,换位会强制进行更改。


在源代码中发现了这个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))
Run Code Online (Sandbox Code Playgroud)

如果正在比较的项目与数组的数据类型不匹配,则会抛出此错误。