python - Pandas :用 boolean 值替换会产生不一致的结果

标签 python pandas boolean

我有一个数据框,它由 xv 之类的复选标记组成,我正在用以下行替换为 boolean 值:

df.replace({'v': True, 'x': False}, inplace=True)

在运行df.replace() 之前,根据df.dtypes 所有列的类型都是object。在 replace() 之后,所有其他列仍然是 object,只有一个列是 bool 类型,其中的值是 numpy.bool_。 Pycharm 以红色背景显示此特定列的真值,如下所示。

pandas boolean dataframe

为什么会发生这种情况? object 不适合存储 boolean 值吗?为什么 pandas 将这一列的 dtypeobject 更改为 bool?到底是什么控制了它,我如何强制将 dtype 保留为 object

是否有理由将所有列改为 pandas.np.bool,例如出于性能原因?

最佳答案

Pandas 在内部将序列存储为 NumPy 数组。当一个系列有混合类型时,Pandas/NumPy 必须做出决定:它选择一个包含该系列中所有类型的类型。举个简单的例子,如果你有一系列 int 类型的整数,并将单个值更改为 float,你的系列将成为 float 类型.

在此示例中,您的第 0 和第 2 个系列具有 NaN 值。现在 NaNnp.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 == 1False == 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/

相关文章:

python - wxPython 的 wx.ListCtrl 处于简单列表模式(不是 style = wx.LC_REPORT)

python - 如何正确使用 tf.scatter_update 进行 N 维更新?

python - Pandas:将 IP 解析为国家/地区的最快方法

python - Pandas 将相同的系列附加到每一列

python - 使用正则表达式获取 XML 父标签

python - 如何将此列表排序函数从 Python 2 转换为 Python 3

python - 使用 keras 的回归模型

java - 如何将二维数组中的每个 boolean 值更改为其相反值?

python - "banana"< "orange"为真,"banana"< "Orange"为假,但为什么呢?

haskell - Haskell 中使用 IO Bool 进行列表理解