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