2017-03-16 67 views
2

给定具有两个唯一值的系列,以元素相反的值获取系列的最有效方法是什么?这里有一个例子:从具有两个唯一值的熊猫系列返回相反值

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

我要寻找一个功能被应用到ser,返回:

0 b 
1 a 
2 b 

编辑:此外,如何将溶液中ammended如果存在空值。也就是说,如果

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

,我们想获得:

0 b 
1 a 
2 np.nan 
3 b 

回答

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在我们的情况下,通过与我们的反i切片唯一值u。由于u只有2个值,因此这些值将是01。所以当我们切片u[i]时,我们得到array(['a', 'b', 'a'], dtype=object)。但是,我们可以得到相反u[1 - i]产量array(['b', 'a', 'b'], dtype=object)

+0

有可能的方式来调整NaN的?正如我在编辑 – splinter

+0

@splinter中所添加的那样,这会成为另一个问题。 – piRSquared

3

您可以通过元素的系列使用做一个元素的运用:

代码:

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

你会得到我的投票+1 – piRSquared