查找python数据帧中每行的最高值

查找python数据帧中每行的最高值,python,pandas,ranking,Python,Pandas,Ranking,我希望在每行中找到最高值,并在python中返回该值的列标题。例如,我想在每行中找到前两位: df = A B C D 5 9 8 2 4 1 2 3 我希望我的输出如下所示: df = B C A D 您可以使用字典理解来生成数据帧每行中的最大值。我转置了数据帧,然后将nlargest应用于每一列。我使用.index.t

我希望在每行中找到最高值,并在python中返回该值的列标题。例如,我想在每行中找到前两位:

df =  
       A    B    C    D  
       5    9    8    2  
       4    1    2    3  
我希望我的输出如下所示:

df =        
       B    C  
       A    D

您可以使用字典理解来生成数据帧每行中的
最大值。我转置了数据帧,然后将
nlargest
应用于每一列。我使用
.index.tolist()
提取所需的
顶列。最后,我转换了这个结果,将数据帧恢复到所需的形状

top_n = 2
>>> pd.DataFrame({n: df.T[col].nlargest(top_n).index.tolist() 
                  for n, col in enumerate(df.T)}).T
   0  1
0  B  C
1  A  D

我决定使用另一种方法:对每一行应用
pd.Series.nlargest()
函数

解决方案路径

>>> df.apply(pd.Series.nlargest, axis=1, n=2)
     A    B    C    D
0  NaN  9.0  8.0  NaN
1  4.0  NaN  NaN  3.0
df.apply(lambda s, n: pd.Series(s.nlargest(n).index), axis=1, n=2)
   0  1
0  B  C
1  A  D
这为我们提供了每行的最高值,但保留了原始列,从而产生了丑陋的NaN值,其中列不是前n个值的所有部分。实际上,我们希望接收
nlargest()
结果的索引

>>> df.apply(lambda s, n: s.nlargest(n).index, axis=1, n=2)
0    Index(['B', 'C'], dtype='object')
1    Index(['A', 'D'], dtype='object')
dtype: object
差不多了。唯一剩下的就是将索引对象转换为序列

解决方案

>>> df.apply(pd.Series.nlargest, axis=1, n=2)
     A    B    C    D
0  NaN  9.0  8.0  NaN
1  4.0  NaN  NaN  3.0
df.apply(lambda s, n: pd.Series(s.nlargest(n).index), axis=1, n=2)
   0  1
0  B  C
1  A  D

请注意,我没有使用
Index.to_series()
函数,因为我不想保留原始索引。

我不确定是否理解。输出中是否缺少数字?您可能正在寻找
nlargest
方法。我想显示的输出是相应的列标题。所以,输入的第一行中的9和8是B列和C列。希望这有意义。我把最大的方法搞砸了,但还没弄明白。不过我可能做错了。