【问题标题】:How to get the column for a column having max value in python?如何在python中获取具有最大值的列?
【发布时间】:2020-06-25 14:08:57
【问题描述】:

我有一个数据框:

df = pd.DataFrame({'p1_c': [1,10,3,40],
                   'p2_c': [4,3,4,14],
                   'p3_c': [5,2,8,78],
                   'p1_v': [776,1776,300,600],
                   'p2_v': [998,98,100,100],
                   'p3_v': [800,80,50,500]
                  })
df
   p1_c  p2_c  p3_c  p1_v  p2_v  p3_v
0     1     4     5   776   998   800
1    10     3     2  1776    98    80
2     3     4     8   300   100    50
3    40    14    78   600   100   500

(p1_c,p1_v),(p2_c,p2_v),(p3_c,p3_v) 分组并描述相同的事物。
我想要获取具有最高 c 值的第 v 列值

例如见第 0 行:

df[[p1_c,p2_c,p3_c]].max(axis=1)   
#get the max value i.e p3_c

所以我想要 p3_v 值作为输出(即 800)。相同的模式后跟第 1、2 和 3 行。

预期输出

   p1_c  p2_c  p3_c  p1_v   p2_v  p3_v  RESULT
 0  1     4     5    776    998    800   800
 1  10    3     2    1776    98    80    1776
 2  3     4     8    300    100    50    50
 3  40   154    78   600    100    500   100

【问题讨论】:

  • 先生,现在清楚了吗,我现在想要什么作为输出? @Diptangsu Goswami
  • 不幸的是它不是。
  • @Amit 我很清楚。他正在尝试获取相应的最大值,即如果第 0 行中的最大值位于 p3_c 列,他想在该行中获取 p3_v

标签: python python-3.x pandas


【解决方案1】:

你可以用df.to_records试试这个,我觉得更简单,而且可能是最快的方法:

df['RESULT']=[row[list(row).index(max(list(row)[1:4]))+3]for row in df.to_records()]
print(df)

输出:

   p1_c  p2_c  p3_c  p1_v  p2_v  p3_v  RESULT
0     1     4     5   776   998   800     800
1    10     3     2  1776    98    80    1776
2     3     4     8   300   100    50      50
3    40    14    78   600   100   500     500

【讨论】:

    【解决方案2】:

    您可以使用 filter 来获取 _c 和 _v 列,并使用 where 替换 _v 列中的 nan 值,其中 _c 列中的值不是每行的掩码。然后获取max

    #get only _c columns
    dfc = df.filter(regex='_c')
    
    df['RESULT'] = (df.filter(regex='_v') #get _p columns
                      #keep value in _p where max in _c per row 
                      .where(dfc.eq(dfc.max(axis=1).to_numpy()[:, None]).to_numpy())
                      .max(axis=1) #get the max
                   )
    print (df)
       p1_c  p2_c  p3_c  p1_v  p2_v  p3_v  RESULT
    0     1     4     5   776   998   800   800.0
    1    10     3     2  1776    98    80  1776.0
    2     3     4     8   300   100    50    50.0
    3    40   154    78   600   100   500   100.0
    

    【讨论】:

      【解决方案3】:

      绝对不是一个理想的解决方案,但它解决了问题。

      from pandas import DataFrame
      
      df = DataFrame({'p1_c': [1,10,3,40], 'p2_c': [4,3,4,14], 'p3_c': [5,2,8,78], 'p1_v': [776, 1776, 300, 600], 'p2_v': [998, 98, 100, 100], 'p3_v': [800, 80, 50, 500]})
      
      df['RESULT'] = [df.loc[i, df.loc[i, df.columns[:3]].idxmax(axis=1)[:-1] + 'v'] for i in range(len(df))]
      
         p1_c  p2_c  p3_c  p1_v  p2_v  p3_v  RESULT
      0     1     4     5   776   998   800     800
      1    10     3     2  1776    98    80    1776
      2     3     4     8   300   100    50      50
      3    40    14    78   600   100   500     500
      

      【讨论】:

        【解决方案4】:

        试试这个

        data={'p1_c':[1,10,3,40],'p2_c':[4,3,3,14],'p3_c':[5,2,8,78],'p1_v':[776,1776,300,600],'p2_v':[998,98,100,100],'p3_v':[800,80,50,500]}
        df_1=pd.DataFrame(data)
        list=[]
        for i in range(4):
          if df_1[['p1_c','p2_c','p3_c']].max(axis=1)[i]==df_1.loc[i,'p3_c']:
             list.append(df_1.loc[i,'p3_v'])
          else:
             list.append(df_1[['p1_v','p2_v']].max(axis=1)[i])
        
        
        df_1['Result']=list
        df_1
        

        输出

          p1_c  p2_c    p3_c    p1_v    p2_v    p3_v    Result
        0         1     4   5   776     998       800     800
        1         10    3   2   1776    98        80      1776
        2          3    3   8   300     100       50      50
        3         40    14  78  600     100       500     500
        

        【讨论】:

          【解决方案5】:

          使用Series.str.endswithDataFrame.idxmax以及axis=1提取以_c结尾并包含最大值的列名,然后使用Series.str.rstrip.add替换_c在这些列名中使用_v,最后使用DataFrame.lookup 根据此cols 从数据框中获取值:

          cols = df.loc[:, df.columns.str.endswith('_c')].idxmax(axis=1)
          cols = cols.str.rstrip('_c').add('_v')
          df['RESULT'] = df.lookup(df.index, cols)
          

          结果:

          # print(df)
          
             p1_c  p2_c  p3_c  p1_v  p2_v  p3_v  RESULT
          0     1     4     5   776   998   800     800
          1    10     3     2  1776    98    80    1776
          2     3     4     8   300   100    50      50
          3    40   154    78   600   100   500     100
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-30
            • 2019-06-28
            • 2013-06-21
            • 2022-01-05
            • 2010-11-30
            • 1970-01-01
            • 1970-01-01
            • 2011-07-04
            相关资源
            最近更新 更多