【问题标题】:Return opposite values from a pandas Series that has two unique values从具有两个唯一值的熊猫系列返回相反的值
【发布时间】:2017-08-08 05:08:15
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.x pandas series


    【解决方案1】:

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

    工作原理

    逆向数组旨在让您通过使用逆向i 分割唯一值u 来重新创建传递的数组v。由于u 只有两个值,这些值将是01。所以当我们切片u[i]时,我们得到array(['a', 'b', 'a'], dtype=object)。但是我们可以得到 相反的u[1 - i] 产生 array(['b', 'a', 'b'], dtype=object)

    【讨论】:

    • 有没有办法针对 nans 进行调整?正如我在编辑中添加的那样
    • @splinter 这作为另一个问题会更好。
    【解决方案2】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      相关资源
      最近更新 更多