Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找每行具有第二个最大值的列名(熊猫)_Python_Pandas_Dataframe - Fatal编程技术网

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

Python 查找每行具有第二个最大值的列名(熊猫),python,pandas,dataframe,Python,Pandas,Dataframe,基于这篇文章:很清楚如何使用df.idxmax(axis=1)获得每行最大值的列名 问题是,如何获得每行的第2、第3等最大值?您需要位置,然后通过索引对列名重新排序: 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

基于这篇文章:很清楚如何使用
df.idxmax(axis=1)
获得每行最大值的列名

问题是,如何获得每行的第2、第3等最大值?

您需要位置,然后通过
索引对列名重新排序:

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

虽然没有在行中查找特定列组的方法,但可以使用该方法对数据帧中的元素进行排序

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

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
 >>> 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
>>> ranks.where(ranks==2).notnull().values.nonzero()
    (array([0, 1, 2]), array([1, 0, 1]))
默认情况下,将
rank
应用于数据帧并使用
method='densed'
将导致浮动列组。只需执行以下操作即可轻松解决此问题:

 >>> 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
 >>> 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
>>> ranks.where(ranks==2).notnull().values.nonzero()
    (array([0, 1, 2]), array([1, 0, 1]))
pandas
中查找索引有点困难,但可以在某个条件下(即
ranks==2
)继续查找以应用过滤器:

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

 >>> 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
 >>> 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
>>> 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])
对于第三个元素,您只需将
where
中的条件更改为
ranks.where(ranks==3)
等其他列