Python 从列编号中获取列名称

Python 从列编号中获取列名称,python,pandas,Python,Pandas,我有一个dataframe,我想返回具有三个最高值的列的名称。例如: import numpy as np import pandas as pd a = np.array([[2., 1., 0., 5., 4.], [6., 10., 7., 1., 3.]]) df = pd.DataFrame(a, columns=['A', 'B', 'C', 'D', 'E']) 给出: A B C D E 0 2 1 0 5 4 1 6 10 7 1 3

我有一个dataframe,我想返回具有三个最高值的列的名称。例如:

import numpy as np
import pandas as pd

a = np.array([[2., 1., 0., 5., 4.], [6., 10., 7., 1., 3.]])
df = pd.DataFrame(a, columns=['A', 'B', 'C', 'D', 'E'])
给出:

   A   B  C  D  E
0  2   1  0  5  4
1  6  10  7  1  3
对于每一行,我想添加三个新列,列名称的三个值最高:

   A   B  C  D  E First Second Third
0  2   1  0  5  4     D      E     A
1  6  10  7  1  3     B      C     A
我已经使用
argpartition
获得了每行前三列的索引:

inx = df.apply(np.argpartition, args=(-3,), axis=1).ix[:, -3:].values
然后需要进行分类

sorted_inx = inx.sort()

现在还不清楚我将如何获取这些列索引,获取名称,然后将它们重新填充到
df
中,作为三个新列,而Ed的答案非常有效,在某些情况下,应用可能是必要的,我尽量避免在pandas中使用apply,并完全使用矩阵运算,因为它通常会带来更好的性能

在这种情况下,如果您使用应用于行的numpy的argsort获取前三个值的索引,则生成的索引可以与数据框的columns属性相结合,以获得您要查找的结果

pd.concat((df, pd.DataFrame(df.columns[np.argsort(df.values, axis=1)[:, -3:][:, ::-1]], 
          columns=['First', 'Second', 'Third'])), axis=1)

   A   B  C  D  E First Second Third
0  2   1  0  5  4     D      E     A
1  6  10  7  1  3     B      C     A
由于开销的原因,给定示例的性能改进很小:

>>> %timeit pd.concat((df, pd.DataFrame(df.columns[np.argsort(df.values, axis=1)[:, -3:][:, ::-1]], columns=['First', 'Second', 'Third'])), axis=1)
100 loops, best of 3: 1.33 ms per loop

>>> %timeit df.apply(lambda x: pd.Series(x.sort_values(ascending=False).index[:3]), axis=1)
100 loops, best of 3: 3.55 ms per loop
当您扩大问题的范围时,应用方法仅为20000行占用了1500倍的时间,因此改进变得非常显著:

a = np.array([[2., 1., 0., 5., 4.], [6., 10., 7., 1., 3.]] * 10000)
df = pd.DataFrame(a, columns=['A', 'B', 'C', 'D', 'E'])

>>> %timeit pd.concat((df, pd.DataFrame(df.columns[np.argsort(df.values, axis=1)[:, -3:][:, ::-1]], columns=['First', 'Second', 'Third'])), axis=1)
100 loops, best of 3: 4.14 ms per loop

>>> %timeit df.apply(lambda x: pd.Series(x.sort_values(ascending=False).index[:3]), axis=1)
1 loops, best of 3: 9.47 s per loop

这肯定更好+1您能稍微解释一下这一部分实现了什么吗:
[:,:-1]
?我可以猜测它正在抓取所有行,但在本例中,
-1
并不清晰。它所做的一切是创建一个数据视图,该视图与argsort排序后的每一行的顺序相反。第一部分
[:,
告诉它跨所有行操作,而第二部分
:-1]
告诉numpy获取行中的所有元素并颠倒它们的顺序。谢谢!这是有道理的