在python的pandas中反转布尔列

8 浏览
0 Comments

在python的pandas中反转布尔列

我有一个包含布尔值的pandas Series 对象。如何获得一个包含每个值的逻辑 NOT 的系列?

例如,考虑一个包含以下内容的系列:

True
True
True
False

我想要获得的系列将包含:

False
False
False
True

这似乎应该相当简单,但显然我弄丢了我的灵感 =(

0
0 Comments

问题:如何在Python的pandas库中反转布尔列?

原因:在上述的代码示例中,用户尝试使用负号(-)来将布尔列反转,但是发现这种方法无效。因此,用户希望了解如何正确地进行布尔列的反转。

解决方法:根据上述代码示例,我们可以看到使用负号(-)对布尔列进行反转是行不通的。然而,在pandas库中,可以使用~运算符来实现布尔列的反转。

以下是解决这个问题的示例代码:

import pandas as pd
# 创建布尔列
s = pd.Series([True, True, True, False])
# 使用~运算符反转布尔列
reversed_s = ~s
print(reversed_s)

运行上述代码,将得到以下输出:

0    False
1    False
2    False
3     True
dtype: bool

这样,我们就成功地将布尔列反转了。通过使用~运算符,我们可以轻松地在pandas中实现布尔列的反转操作。

0
0 Comments

问题的出现原因是在Pandas 0.13.0之后,Series不再是numpy.ndarray的子类,而是pd.NDFrame的子类。可能是因为这个原因,np.invert(s)的速度不如~s或-s快。

解决方法是使用~s来反转一个布尔Series。

以下是一个例子,展示了如何使用~s来反转布尔Series:

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

输出结果为:

0    False
1    False
2    True
3    False
dtype: bool

另外,还可以使用-np.invert(s)或者-s来反转布尔Series。

以下是一个使用timeit模块测试不同方法性能的例子:

s = pd.Series([True, True, False, True]*10000)
%timeit np.invert(s)
%timeit ~s
%timeit (-s)

输出结果为:

10000 loops, best of 3: 91.8 µs per loop
10000 loops, best of 3: 73.5 µs per loop
10000 loops, best of 3: 73.5 µs per loop

注意:timeit的结果可能因为硬件、编译器、操作系统、Python、NumPy和Pandas版本等多个因素而有所不同。

另外,除了速度较慢之外,~和-之间的区别是什么?

Pandas文档中提到了~操作符,可以在这里查看相关信息。

总结一下,问题的出现原因是Pandas从0.13.0版本开始,Series不再是numpy.ndarray的子类,而是pd.NDFrame的子类,导致np.invert(s)不再像以前那样快。解决方法是使用~s或-s来反转布尔Series。

0
0 Comments

问题原因:在Python的pandas库中,当对一个布尔类型的列进行取反操作时,如果该列的数据类型为'object',会得到一个错误的结果。这是因为pandas会将'object'类型的列当作整数进行位运算,导致结果不符合预期。

解决方法:可以使用astype方法将'object'类型的列转换为布尔类型,然后再进行取反操作。具体代码如下:

df['A'].astype(bool)

~df['A'].astype(bool)

在上述代码中,首先使用astype方法将'object'类型的列转换为布尔类型,然后再使用~进行取反操作。这样就可以得到正确的结果。

在给出的示例中,可以通过以下代码将输出的整数类型的掩码转换为布尔类型的系列:

df['A'].astype(bool)

这个方法之所以有效,是因为astype(bool)在~操作之前进行,而~df['A'].astype(bool)和(~df['A']).astype(bool)的结果是不同的。

0