Pandas 熊猫第二大价值';s列名

Pandas 熊猫第二大价值';s列名,pandas,dataframe,Pandas,Dataframe,我试图找到与数据帧中的最大值和第二大值关联的列名,下面是一个简化的示例(真实的示例有500多列): 需要成为: Date 1larg 2larg 1990 val4 val2 1991 val3 val4 1992 val1 val2 1993 val1 val4 1994 val2 val4 我可以用idxmax查找具有最大值(即上面的1larg)的列名,但如何查找第二大的列名?(您的行中没有任何重复的最大值,因此我猜如果您有[1,1,2,2]您

我试图找到与数据帧中的最大值和第二大值关联的列名,下面是一个简化的示例(真实的示例有500多列):

需要成为:

Date  1larg   2larg
1990  val4    val2
1991  val3    val4
1992  val1    val2
1993  val1    val4
1994  val2    val4
我可以用idxmax查找具有最大值(即上面的1larg)的列名,但如何查找第二大的列名?

(您的行中没有任何重复的最大值,因此我猜如果您有
[1,1,2,2]
您希望选择
val3
val4

一种方法是使用
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]
行。)


或者,您也可以将分解成一个平面格式,在每个日期组中选择最大的两个值,然后再次将其转换。

如上所述,这是可行的,但我很快就遇到了问题。我遇到了一种情况,除了一个值之外,所有的值都是零。看起来Python只是随机地(或从右边)获取最大值和两个零。是否有办法两次生成非零列名(列0和列1)?
         0     1
Date            
1990  val4  val2
1991  val3  val4
1992  val1  val2
1993  val1  val4
1994  val2  val4
1995  val4  val3