[英]Find the column name which has the 2nd maximum value for each row (pandas)
您需要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.