Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反转布尔数列将产生-1表示假,而-2表示真_Python_Pandas_Dataframe_Invert - Fatal编程技术网

Python 反转布尔数列将产生-1表示假,而-2表示真

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

我在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, 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,其中填充的可能是普通的Python
bool
s。将
~
应用于这样一个系列需要按元素进行,并将普通的
~
运算符应用于每个元素,而普通Python bools从
int
继承
~
——它们不会对此操作执行逻辑求反

在应用
~
获取逻辑求反之前,可以先将序列转换为布尔数据类型:

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


您还应该首先弄清楚为什么您的系列中有object dtype——解决这个问题的正确位置可能在代码的前面,而不是这里。可能是您构建的错误,或者您试图使用NaN或None来表示缺少的值。

您是否尝试过
mask=not subset_df['Status']
?@MarkRansom这是错误消息,正在使用not
ValueError:序列的真值不明确。使用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']]!如果你喜欢我的答案,请投我一票。对不起!我不知道熊猫的面具是什么。