Pandas 熊猫第二大价值';s列名
我试图找到与数据帧中的最大值和第二大值关联的列名,下面是一个简化的示例(真实的示例有500多列): 需要成为: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]您
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