熊猫第二大值的列名

Ato*_*Siv 7 dataframe pandas

我试图找到与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
Run Code Online (Sandbox Code Playgroud)

需要成为:

Date  1larg   2larg
1990  val4    val2
1991  val3    val4
1992  val1    val2
1993  val1    val4
1994  val2    val4
Run Code Online (Sandbox Code Playgroud)

我可以找到idxmax具有最大值(i,e,1larg)的列名,但是如何找到第二大?

DSM*_*DSM 8

(您的行中没有任何重复的最大值,因此,如果[1,1,2,2]您想要val3并被val4选中,我会猜测.)

一种方法是使用结果argsort作为具有列名称的Series的索引.

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)
Run Code Online (Sandbox Code Playgroud)

产生

         0     1
Date            
1990  val4  val2
1991  val3  val4
1992  val1  val2
1993  val1  val4
1994  val2  val4
1995  val4  val3
Run Code Online (Sandbox Code Playgroud)

(我在那里添加了额外的1995 [1,1,2,2]行.)

或者,您可以melt使用平面格式,在每个日期组中选出最大的两个值,然后再将其转换.