Python 反转布尔数列将产生-1表示假,而-2表示真
我在Pandas数据框中有一个系列的子集,其中填充了布尔值True和False。我正在尝试使用Python 反转布尔数列将产生-1表示假,而-2表示真,python,pandas,dataframe,invert,Python,Pandas,Dataframe,Invert,我在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
~
反转序列
这是该系列的原始子集
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, Length: 197, dtype: object
但我真正想要的是以下输出:
7 False
8 True
14 False
38 True
72 True
...
Name: Status, Length: 197, dtype: object
如果您能让我知道如何在不将布尔级数转换为-1和-2的情况下反转它们,我将非常感激。非常感谢。编辑:
如果状态
列为对象/字符串
类型。这里我们检查状态
值是否为真
,然后用假
替换它,用真
替换假字符串
df=pd.DataFrame({
'Status':['True', 'False', 'True', 'False', 'False']
})
df.Status = np.where(df['Status']=='True',False,True)
df
输出
Status
0 False
1 True
2 False
3 True
4 True
0 False
1 True
2 False
3 True
4 True
dtype: bool
Status
0 False
1 True
2 False
3 True
4 True
如果系列
属于布尔类型
,则可以遵循以下选项
s = pd.Series([True, False, True, False, False])
两个选项
-s
或
输出
Status
0 False
1 True
2 False
3 True
4 True
0 False
1 True
2 False
3 True
4 True
dtype: bool
Status
0 False
1 True
2 False
3 True
4 True
您尝试的方法也适用于df
df=pd.DataFrame({
'Status':[True, False, True, False, False]
})
df['Status'] = ~df['Status']
df
输出
Status
0 False
1 True
2 False
3 True
4 True
0 False
1 True
2 False
3 True
4 True
dtype: bool
Status
0 False
1 True
2 False
3 True
4 True
您可以将熊猫系列的替换功能用作:
subset_df['Status'].replace(to_replace=[True, False], value=[False, True])
这将返回另一个具有替换值的序列。但如果要更改实际数据帧,则可以添加参数“inplace=True”,如下所示:
subset_df['Status'].replace(to_replace=[True, False], value=[False, True], inplace=True)
出于某种原因,您有一系列的
object
dtype,其中填充的可能是普通的Pythonbool
s。将~
应用于这样一个系列需要按元素进行,并将普通的~
运算符应用于每个元素,而普通Python bools从int
继承~
——它们不会对此操作执行逻辑求反
在应用~
获取逻辑求反之前,可以先将序列转换为布尔数据类型:
~series.astype(bool)
在足够新的Pandas版本(1.0及更高版本)上,您可能希望使用带有astype('boolean')
的新版本,而不是astype(bool)
您还应该首先弄清楚为什么您的系列中有object dtype——解决这个问题的正确位置可能在代码的前面,而不是这里。可能是您构建的错误,或者您试图使用NaN或None来表示缺少的值。您是否尝试过
mask=not subset_df['Status']
?@MarkRansom这是错误消息,正在使用notValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
非常感谢您的建议。不知道为什么,但当使用-s
或np.invert
时,输出仍然是dtype=object
,而不是bool。然后,如果我应用以下函数error=subset_df[mask][[a',b']].copy()
keyrerror:[Int64Index([-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n dtype='int64',length=197)]都不在[columns]中,好的,似乎状态
列是对象
类型而不是布尔类型。更新了答案以支持这一点。这是有意义的,只是想知道为什么我们要编写这样的逻辑np。where(df['Status']='True',False,True)
我也认为df.Status=np。where(df['Status']='True',False,True)
只有在类型是字符串而不是Object的情况下才能工作。因为当类型为object时,与“True”的比较将始终为False。更新了解决方案中np.where
的解释。此解决方案将同时适用于字符串和对象类型。我将让您探索熊猫中字符串和对象之间的相似性。非常感谢。replace方法确实会在序列中创建相反的值,但是我是否可以使用掩码?因为我的下一步是做error=subset_-df[mask][[a',b']]!如果你喜欢我的答案,请投我一票。对不起!我不知道熊猫的面具是什么。