我正在尝试查找与DataFrame中最大和第二大值相关联的列名称,这是一个简化示例(真正的列有超过500列):
Date val1 val2 val3 val4
1990 5 7 1 10
1991 2 1 10 3
1992 10 9 6 1
1993 50 10 2 15
1994 1 15 7 8
需要成为:
Date 1larg 2larg
1990 val4 val2
1991 val3 val4
1992 val1 val2
1993 val1 val4
1994 val2 val4
我可以找到idxmax具有最大值(i,e,1larg)的列名,但我怎样才能找到第二大?
答案 0 :(得分:6)
(您的行中没有任何重复的最大值,因此如果您有[1,1,2,2]
,我想您可以选择val3
和val4
。)< / p>
一种方法是使用argsort
的结果作为带有列名的系列的索引。
df = df.set_index("Date")
arank = df.apply(np.argsort, axis=1)
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:2]]
new_frame = pd.DataFrame(ranked_cols, index=df.index)
产生
0 1
Date
1990 val4 val2
1991 val3 val4
1992 val1 val2
1993 val1 val4
1994 val2 val4
1995 val4 val3
(我已经添加了额外的1995 [1,1,2,2]
行。)
或者,您可以melt
成平面格式,在每个日期组中选出最大的两个值,然后再将其重新设置。