Return 来自具有两个唯一值的 pandas 系列的相反值

Return opposite values from a pandas Series that has two unique values

给定一个具有两个唯一值的系列,获得具有元素方向相反值的系列的最有效方法是什么?这是一个例子:

ser = pd.Series(['a', 'b', 'a'])

我正在寻找一个应用于ser的函数,返回:

0    b
1    a
2    b

编辑: 此外,如果存在空值,将如何修改解决方案。也就是说,如果

ser = pd.Series(['a', 'b', np.nan , 'a'])

我们想得到:

0    b
1    a
2    np.nan
3    b

您可以使用应用逐个元素地对系列进行操作:

代码:

ser = pd.Series(['a', 'b', 'a'])
print(ser.apply(lambda x: 'a' if x == 'b' else 'b'))

结果:

0    b
1    a
2    b
dtype: object

使用numpy.unique得到一个方便的逆数组。

v = ser.values
u, i = np.unique(v, return_inverse=True)

如果确实只有 2 个唯一值,那么您可以这样做。

pd.Series(u[1 - i], ser.index)

0    b
1    a
2    b
dtype: object

工作原理

逆数组旨在让您重新创建传递的数组,在我们的例子中是 v,方法是将唯一值 u 与我们的逆数组 i 进行切片。由于 u 只有 2 个值,因此这些值将是 01。所以当我们切片 u[i] 时,我们得到 array(['a', 'b', 'a'], dtype=object)。但是我们可以得到 相反的 u[1 - i] 产量 array(['b', 'a', 'b'], dtype=object)