开发者社区> 问答> 正文

Pandas最大行数,前n个最大值

我正在尝试创建顶部列,这是几个列行的最大值。熊猫有一个最大的方法,但我无法使其连续工作。Pandas还具有max和idxmax,它们完全可以执行我想做的事情,但仅用于绝对最大值。

df = pd.DataFrame(np.array([[1, 2, 3, 5, 1, 9], [4, 5, 6, 2, 5, 9], [7, 8, 9, 2, 5, 10]]), columns=['a', 'b', 'c', 'd', 'e', 'f'])
cols = df.columns[:-1].tolist()

df['max_1_val'] = df[cols].max(axis=1)
df['max_1_col'] = df[cols].idxmax(axis=1)

输出:

    a   b   c   d   e   f   max_1_val   max_1_col
0   1   2   3   5   1   9   5           d
1   4   5   6   2   5   9   6           c
2   7   8   9   2   5   10  9           c

但是我尝试获取max_n_val和max_n_col,因此前3名的预期输出为:

    a   b   c   d   e   f   max_1_val   max_1_col   max_2_val   max_2_col   max_3_val   max_3_col
0   1   2   3   5   1   9   5           d           3           c           2           b
1   4   5   6   2   5   9   6           c           5           b           5           e
2   7   8   9   2   5   10  9           c           8           b           7           a

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 17:53:30 1536 0
1 条回答
写回答
取消 提交回答
  • 为了提高性能,将numpy.argsort用作头寸,为了正确的顺序使用最后3项,并通过索引来反转:

    N = 3
    a = df[cols].to_numpy().argsort()[:, :-N-1:-1]
    print (a)
    [[3 2 1]
     [2 4 1]
     [2 1 0]]
    

    然后通过索引c来获取列名称,并为d中的值重新排序,请使用以下解决方案:

    c = np.array(cols)[a]
    d = df[cols].to_numpy()[np.arange(a.shape[0])[:, None], a]
    

    最后创建DataFrame,由concat加入,并按DataFrame.reindex`重新排序列名:

    df1 = pd.DataFrame(c).rename(columns=lambda x : f'max_{x+1}_col')
    df2 = pd.DataFrame(d).rename(columns=lambda x : f'max_{x+1}_val')
    
    c = df.columns.tolist() + [y for x in zip(df2.columns, df1.columns) for y in x]
    
    df = pd.concat([df, df1, df2], axis=1).reindex(c, axis=1)
    print (df)
       a  b  c  d  e   f  max_1_val max_1_col  max_2_val max_2_col  max_3_val  \
    0  1  2  3  5  1   9          5         d          3         c          2   
    1  4  5  6  2  5   9          6         c          5         e          5   
    2  7  8  9  2  5  10          9         c          8         b          7   
    
      max_3_col  
    0         b  
    1         b  
    2         a  
    

    回答来源:stackoverflow

    2020-03-24 17:53:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载