我有一个数据框,它由 x
和 v
之类的复选标记组成,我正在用以下行替换为 boolean 值:
df.replace({'v': True, 'x': False}, inplace=True)
在运行df.replace()
之前,根据df.dtypes
所有列的类型都是object
。在 replace()
之后,所有其他列仍然是 object
,只有一个列是 bool 类型,其中的值是 numpy.bool_
。 Pycharm 以红色背景显示此特定列的真值,如下所示。
为什么会发生这种情况? object
不适合存储 boolean 值吗?为什么 pandas
将这一列的 dtype
从 object
更改为 bool
?到底是什么控制了它,我如何强制将 dtype 保留为 object
?
是否有理由将所有列改为 pandas.np.bool
,例如出于性能原因?
最佳答案
Pandas 在内部将序列存储为 NumPy 数组。当一个系列有混合类型时,Pandas/NumPy 必须做出决定:它选择一个包含该系列中所有类型的类型。举个简单的例子,如果你有一系列 int
类型的整数,并将单个值更改为 float
,你的系列将成为 float
类型.
在此示例中,您的第 0 和第 2 个系列具有 NaN
值。现在 NaN
或 np.nan
被认为是 float
(尝试 type(np.nan)
,这将返回float
),而 True
/False
被认为是 boolean 值。 NumPy 可以存储这些值的唯一方法是使用 dtype object
,它只是一堆指针(很像一个列表)。
另一方面,您的第一列只有 boolean 值,可以用 bool
类型存储。这里的好处是因为您没有使用指针集合,NumPy 可以为此数组分配一个连续的内存块。这将产生相对于 object
系列或 list
的性能优势。
您可以自己测试以上所有内容。以下是一些示例:
s1 = pd.Series([True, False])
print(s1.dtype) # bool
s2 = pd.Series([True, False, np.nan])
print(s2.dtype) # object
s3 = pd.Series([True, False, 0, 1])
print(s3.dtype) # object
最后一个例子很有趣,因为在 Python 中 True == 1
和 False == 0
都返回 True
因为 bool
可以被认为是 int
的子类。因此,在内部,Pandas/NumPy 决定不强制执行这种相等性并选择其中之一。这样做的必然结果是,建议您在处理混合类型时检查系列的类型。
另请注意,当您更新值时,Pandas 会检查数据类型:
s1 = pd.Series([True, 5.4])
print(s1.dtype) # object
s1.iloc[-1] = False
print(s1.dtype) # bool
关于python - Pandas :用 boolean 值替换会产生不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788585/