【问题标题】:Check every row for each column values in a df in python检查python中df中每一列值的每一行
【发布时间】:2020-03-23 04:12:59
【问题描述】:

我是熊猫数据框的新手。所以,我需要帮助 我有一个如下所述的 df:

  Location      A      B      C      D
0        X  GREEN    RED  GREEN  AMBER
1        Y  GREEN    RED    RED    RED
2        Z  GREEN  GREEN  GREEN  GREEN
3        R  GREEN  GREEN  GREEN  GREEN 

我想要数据框中每一行和每一列的状态列。状态列基于列 A、B、C 和 D。如果一行中的任何列值为 RED,则 Status 为 RED。否则,如果任何列值为琥珀色,则状态为琥珀色,否则为绿色。

对于每一列,当该列中的任何值为红色时,输出将为红色。否则,如果任何列值为琥珀色,则值为琥珀色。其他列的值将是绿色的。

输出应该是这样的

  Location      A      B      C      D  Status
0        X  GREEN    RED  GREEN  AMBER     RED
1        Y  GREEN    RED    RED    RED     RED
2        Z  GREEN  GREEN  GREEN  GREEN   AMBER
3        R  GREEN  GREEN  GREEN  GREEN   GREEN
            GREEN    RED    RED    RED

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    想法是创建优先值列表,通过DataFrame.stack 重塑值,转换为分类,通过GroupBy.first 排序并获取第一个值:

    priority = ['RED','AMBER','GREEN']
    c = ['A','B','C','D']
    s = df[c].stack()
    
    cats = pd.Categorical(s, ordered=True, categories=priority)
    df['Status'] = pd.Series(cats, index=s.index).sort_values().groupby(level=0).first()
    print (df)
      Location      A      B      C      D Status
    0        X  GREEN    RED  GREEN  AMBER    RED
    1        Y  GREEN    RED    RED    RED    RED
    2        Z  GREEN  AMBER  GREEN  GREEN  AMBER
    3        R  GREEN  GREEN  GREEN  GREEN  GREEN
    

    【讨论】:

      【解决方案2】:

      这是沿轴 1 使用 numpy.selecteqany 的另一个解决方案:

      condlist = [
          df.loc[:, 'A':'D'].eq('RED').any(1),
          df.loc[:, 'A':'D'].eq('AMBER').any(1)
      ]
      
      choicelist = ['RED', 'AMBER']
      
      df['Status'] = np.select(condlist, choicelist, default='GREEN')
      

      [出]

        Location      A      B      C      D Status
      0        X  GREEN    RED  GREEN  AMBER    RED
      1        Y  GREEN    RED    RED    RED    RED
      2        Z  GREEN  GREEN  AMBER  GREEN  AMBER
      3        R  GREEN  GREEN  GREEN  GREEN  GREEN
      

      【讨论】:

        【解决方案3】:

        你可以使用:

        def set_status(row):
          condition = [row['A'], row['B'], row['C'], row['D']]
          if 'RED' in condition:
            return 'RED'
          elif 'AMBER' in condition:
            return 'AMBER'
          else:
            return 'GREEN'
        
        df['Status'] = df.apply(set_status, axis=1)
        

        【讨论】:

          【解决方案4】:

          如果你的df 看起来像这样:

            Location      A      B      C      D
          0        X  GREEN    RED  GREEN  AMBER
          1        Y  GREEN    RED    RED    RED
          2        Z  GREEN  GREEN  AMBER  GREEN
          3        R  GREEN  GREEN  GREEN  GREEN
          

          您可以定义自己的函数,以便将其用作pandas.DataFrame.apply() 中的参数。使用此方法可确保您可以对行和列使用预定义的函数,这正是您的情况。

          代码如下:

          # predefined function
          def get_status(axis):
              for val in ['RED', 'AMBER', 'GREEN']:
                  if val in axis.values:
                      return val
              return 'Status'
          
          # addition of Status row and column
          df = pd.concat([df, df.apply(lambda col: get_status(col), axis=0).to_frame().T], ignore_index=True)
          df['Status'] = df.apply(lambda row: get_status(row), axis=1)
          

          最终输出如下:

          >>> print(df)
            Location      A      B      C      D Status
          0        X  GREEN    RED  GREEN  AMBER    RED
          1        Y  GREEN    RED    RED    RED    RED
          2        Z  GREEN  GREEN  AMBER  GREEN  AMBER
          3        R  GREEN  GREEN  GREEN  GREEN  GREEN
          4   Status  GREEN    RED    RED    RED    RED
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-15
            • 2022-12-03
            • 2015-07-09
            • 1970-01-01
            • 2020-01-25
            相关资源
            最近更新 更多