在python的数据框中的每一行中查找最高值

Mil*_*use 4 python ranking pandas

我想在每一行中找到最高值,并返回python中值的列标题.例如,我想在每行中找到前两个:

df =  
       A    B    C    D  
       5    9    8    2  
       4    1    2    3  
Run Code Online (Sandbox Code Playgroud)

我希望我的输出看起来像这样:

df =        
       B    C  
       A    D
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 6

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

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


tsa*_*sch 6

我决定采用另一种方法:将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
Run Code Online (Sandbox Code Playgroud)

这为我们提供了每一行的最高值,但保留了原始列,导致丑陋的 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
Run Code Online (Sandbox Code Playgroud)

差不多好了。唯一剩下的就是将索引对象转换为系列。

解决方案

df.apply(lambda s, n: pd.Series(s.nlargest(n).index), axis=1, n=2)
   0  1
0  B  C
1  A  D
Run Code Online (Sandbox Code Playgroud)

请注意,我没有使用该Index.to_series()功能,因为我希望保留原来的索引。