反转布尔系列将在 Pandas 中为 False 产生 -1,为 True 产生 -2

问题描述

我在 Pandas 数据框中有一个系列的子集,其中填充了布尔值 True 和 False。我正在尝试使用 ~ 反转系列。

这是该系列的原始子集。

7        True
8       False
14       True
38      False
72      False
...
Name: Status,Length: 197,dtype: object

现在我使用以下代码来反转值。

mask = ~subset_df['Status']

我期待结果是

7       -2
8       -1
14      -2
38      -1
72      -1
        ...

Name: Status,dtype: object

但我真正想要的是以下输出

7        False
8       True
14       False
38      True
72      True
...
Name: Status,dtype: object

如果您能让我知道如何在不将它们转换为 -1 和 -2 的情况下反转布尔系列,我将不胜感激。非常感谢。

解决方法

编辑: 如果 Status 列是 object/string 类型。在这里,我们检查 Status 值是否为 True,然后将其替换为 False,将 False string 替换为 True

df=pd.DataFrame({
    'Status':['True','False','True','False']
})
df.Status = np.where(df['Status']=='True',False,True)
df

输出

    Status
0   False
1   True
2   False
3   True
4   True

如果 series 属于 boolean type,则可以遵循以下选项。

s = pd.Series([True,True,False])

两种选择

-s

np.invert(s)

输出

0    False
1     True
2    False
3     True
4     True
dtype: bool

你尝试过的也适用于 df

df=pd.DataFrame({
    'Status':[True,False]
})
df['Status'] = ~df['Status']
df

输出

    Status
0   False
1   True
2   False
3   True
4   True
,

您可以使用pandas系列的替换功能:

subset_df['Status'].replace(to_replace=[True,False],value=[False,True])

这将返回另一个带有替换值的系列。但是如果你想改变实际的数据框,那么你可以添加一个参数 'inplace=True' 为:

subset_df['Status'].replace(to_replace=[True,True],inplace=True)
,

出于某种原因,您有一系列 object dtype,其中充满了可能是普通 Python bool 的内容。将 ~ 应用到这样的系列会经历元素并将普通的 ~ 运算符应用于每个元素,而普通的 Python bool 从 ~ 继承 int - 它们不执行逻辑否定用于此操作。

在应用 ~ 以获得逻辑否定之前,您可以先将系列转换为 boolean dtype:

~series.astype(bool)

在足够新的 Pandas 版本(1.0 及更高版本)上,您可能希望使用带有 astype('boolean') 的新 nullable boolean dtype 而不是 astype(bool)

您还应该首先弄清楚为什么您的系列具有 object dtype - 解决此问题的正确位置很可能在您代码中的某个位置,而不是此处。也许你构建错了,或者你试图使用 NaN 或 None 来表示缺失值。