Python 从列编号中获取列名称
我有一个dataframe,我想返回具有三个最高值的列的名称。例如: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
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获取行中的所有元素并颠倒它们的顺序。谢谢!这是有道理的