鉴于具有两个唯一值的系列,获得具有元素相反值的系列的最有效方法是什么?这是一个例子:
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
答案 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个值,因此这些值将为0
和1
。因此,当我们切片u[i]
时,我们得到array(['a', 'b', 'a'], dtype=object)
。但我们可以通过u[1 - i]
获得array(['b', 'a', 'b'], dtype=object)