从具有两个唯一值的pandas Series返回相反的值

时间:2017-03-16 20:18:32

标签: python python-3.x pandas series

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用apply:

在系列中按元素执行元素

<强>代码:

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

答案 1 :(得分:3)

使用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)

来获得 相反