繁体   English   中英

找到每行(熊猫)具有第二最大值的列名

[英]Find the column name which has the 2nd maximum value for each row (pandas)

根据这篇文章: 找到具有每一行最大值的列名,很清楚如何使用df.idxmax(axis=1)获得具有每一行最大值的列名。

问题是,如何获得每行的第二,第三等最大值?

您需要numpy.argsort来定位,然后通过indexing重新排列列名:

np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(5,5)), columns=list('ABCDE'))
print (df)
   A  B  C  D  E
0  8  8  3  7  7
1  0  4  2  5  2
2  2  2  1  0  8
3  4  0  9  6  2
4  4  1  5  3  4

arr = np.argsort(-df.values, axis=1)
df1 = pd.DataFrame(df.columns[arr], index=df.index)
print (df1)
   0  1  2  3  4
0  A  B  D  E  C
1  D  B  C  E  A
2  E  A  B  C  D
3  C  D  A  E  B
4  C  A  E  D  B

校验:

#first column
print (df.idxmax(axis=1))
0    A
1    D
2    E
3    C
4    C
dtype: object

#last column
print (df.idxmin(axis=1))
0    C
1    A
2    D
3    B
4    B
dtype: object

虽然没有方法可以在一行中找到特定的等级,但是可以使用rank方法对熊猫数据框中的元素进行rank

例如,对于这样的数据框:

df = pd.DataFrame([[1, 2, 4],[3, 1, 7], [10, 4, 2]], columns=['A','B','C'])

>>> print(df)
      A  B  C
  0   1  2  4
  1   3  1  7
  2  10  4  2

您可以通过执行以下操作来获得每一行的排名:

 >>> df.rank(axis=1,method='dense', ascending=False)
        A    B    C
     0  3.0  2.0  1.0
     1  2.0  3.0  1.0
     2  1.0  2.0  3.0

默认情况下,对数据帧应用rank并使用method='dense'将导致浮动等级。 只需执行以下操作即可轻松解决:

 >>> ranks = df.rank(axis=1,method='dense', ascending=False).astype(int)
 >>> ranks
        A  B  C
     0  3  2  1
     1  2  3  1
     2  1  2  3

pandas ,找到索引有些棘手,但是可以恢复对条件(即ranks==2 )应用过滤器:

>>> ranks.where(ranks==2)
      A    B   C
   0  NaN  2.0 NaN
   1  2.0  NaN NaN
   2  NaN  2.0 NaN    

应用where将仅返回与条件匹配的元素,其余设置为NaN 我们可以通过执行以下操作来检索列和行索引:

>>> ranks.where(ranks==2).notnull().values.nonzero()
    (array([0, 1, 2]), array([1, 0, 1]))

并获取行中的列索引或位置, 这是您的问题的答案

>>> ranks.where(ranks==2).notnull().values.nonzero()[0]
    array([1, 0, 1])

对于第三个元素,您只需要更改ranks.where(ranks==3) where的条件ranks.where(ranks==3) ,以此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM