问题描述
我在 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 来表示缺失值。