【问题标题】:Compare two Pandas columns and set as label比较两个 Pandas 列并设置为标签
【发布时间】:2020-10-24 21:55:24
【问题描述】:

假设我有以下 pd.DataFrame:

df = pd.DataFrame({'a': [10, 20, 30],
                   'b': [5, 25, 30]})

我希望得到

    a   b    label
0   10  5    1
1   20  25   2
2   30  30   3

意思:

  • 如果 a > b 则 label=1
  • 如果 a
  • 如果 a = b 则 label=3

当我有多个条件时,我不知道该怎么做。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试这个,np.where & .loc

    df['label'] = np.where(df['a'] > df['b'], 1, 2)
    
    df.loc[df['a'] == df['b'], 'label'] = 3
    

    编辑

    df['label'] = np.where(df['a'] > df['b'], 1, (np.where(df['a'] < df['b'], 2, 3)))
    

    【讨论】:

      【解决方案2】:

      np.sign 玩得开心,自然会为标志分配类别:

      df['label'] = np.sign(df['a'] - df['b']).map({1: 1, -1: 2, 0: 3})
      df
      
          a   b  label
      0  10   5      1
      1  20  25      2
      2  30  30      3
      

      这里要注意的有趣的是np.sign 输出一个系列,所以我可以直接调用Series.map 来获取你想要的标签。整洁!

      【讨论】:

      • @Sushanth 谢谢你,也谢谢你。如果我先回答,我会在我的帖子中得到你所拥有的,因为np.where 是这个问题的实际解决方案(并且通过测试比这快 10-20%)。但是因为我迟到了,所以我会分享一些你通常看不到的东西:-)
      • @cs95 很好的答案,只是一个小查询,np.sign 的文档指出 np.sign 返回ndarray 那么我们怎么可能使用系列方法呢?
      • @ShubhamSharma 很好的问题,简而言之,numpy 知道它是许多库的基础,因此尽最大努力与它们合作。将 pandas Series 视为 numpy 数组(它就是)上的精美包装对象。 Numpy 将尝试保留“包装对象”的身份,可以说,同时转换底层数据。见related q
      • @cs95 感谢您的解释,我明白了。已经为您建议的问题添加了书签并投票赞成:)。
      • @cs95 所以我猜 np 操作的结果应该与原始输入系列具有相同的大小,以便包装行为起作用,对吧?顺便说一句,非常感谢您的解释..
      【解决方案3】:

      使用np.select根据条件进行选择:

      df['label'] = np.select([df['a'].gt(df['b']), df['a'].lt(df['b'])], [1, 2], 3)
      

      结果:

      # print(df)
      
          a   b   label
      0   10  5       1
      1   20  25      2
      2   30  30      3
      

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 2018-07-11
        相关资源
        最近更新 更多