Python Pandas 布尔型数据框中当数据框等于 False 时,返回 0 而不是 False?

3
如果我有一个只包含True/False值的Dataframe,像这样:

Dataframe

df_mask = pd.DataFrame({'AAA': [True] * 4,
                        'BBB': [False]*4,
                        'CCC': [True, False, True, False]}); print(df_mask)

    AAA    BBB    CCC
0  True  False   True
1  True  False  False
2  True  False   True
3  True  False  False

然后尝试打印相当于 Falsedataframe 中的值,如下所示:
print(df_mask[df_mask == False])
print(df_mask.where(df_mask == False))

我的问题与列CCC有关。列BBB显示为False(正如我所预期的那样),但为什么列CCC中的索引13等于0而不是False

   AAA    BBB  CCC
0  NaN  False  NaN
1  NaN  False    0
2  NaN  False  NaN
3  NaN  False    0
   AAA    BBB  CCC
0  NaN  False  NaN
1  NaN  False    0
2  NaN  False  NaN
3  NaN  False    0

为什么它不返回一个类似这样的dataframe呢?
   AAA    BBB   CCC
0  NaN  False   NaN
1  NaN  False False
2  NaN  False   NaN
3  NaN  False False

2
这对我来说看起来像是一个bug,请你在GitHub上发布这个问题,谢谢。 - EdChum
1个回答

1

不太确定为什么,但如果你正在寻找一个快速解决方案将其转换回布尔值,可以执行以下操作:

>>> df_bool = df_mask.where(df_mask == False).astype(bool)
>>> df_bool
    AAA    BBB    CCC
0  True  False   True
1  True  False  False
2  True  False   True
3  True  False  False

这是因为返回的数据框的数据类型已经改变:它不再是一个布尔型的数据框了。
>>> df2 = df_mask.where(df_mask == False)
>>> df2.dtypes
AAA    float64
BBB       bool
CCC    float64
dtype: object

即使你一开始就将其强制转换为bool类型,这种情况仍会发生:
>>> df_mask = pd.DataFrame({'AAA': [True] * 4,
...                         'BBB': [False]*4,
...                         'CCC': [True, False, True, False]}, dtype=bool); print(df_mask)
    AAA    BBB    CCC
0  True  False   True
1  True  False  False
2  True  False   True
3  True  False  False
>>> df2 = df_mask.where(df_mask == False)
>>> df2
   AAA    BBB  CCC
0  NaN  False  NaN
1  NaN  False    0
2  NaN  False  NaN
3  NaN  False    0

如果你特别担心内存问题,你也可以只返回一个引用,但是除非你明确忽略了旧的引用(在这种情况下它不应该有影响),否则要小心。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html


我还要补充一点,try_cast和inplace关键字参数没有任何作用,这表明它是合理地猜测类型为float。 - Alex Huszagh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接