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)
等其他列