Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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中获得top N值_Python - Fatal编程技术网

如何在python中获得top N值

如何在python中获得top N值,python,Python,我有一份价值清单 说 如果这是我的数据 我只想返回data1的前3个值,并返回所有4列 除了我脑海中的很多if语句之外,还有什么更好的方法来实现这一点呢 我正在调查NLAGEST,但不确定我怎么能做到这一点 ==================================更新========================= 所以如果运行上面的程序,就会得到这个结果 我希望得到的返回df的rowindex值仅为1,2,3,因为它们具有最高的前3位数据1(98,94,95) 虽然heapq.

我有一份价值清单

如果这是我的数据

我只想返回data1的前3个值,并返回所有4列

除了我脑海中的很多if语句之外,还有什么更好的方法来实现这一点呢

我正在调查NLAGEST,但不确定我怎么能做到这一点

==================================更新=========================

所以如果运行上面的程序,就会得到这个结果

我希望得到的返回df的rowindex值仅为1,2,3,因为它们具有最高的前3位数据1(98,94,95)

虽然
heapq.nlargest
,但实际上即使对于相当大的数据帧,
argsort
也会更快:

import heapq
import pandas as pd
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a']*10000,
                 'key2' : ['one', 'two', 'one', 'two', 'one']*10000,
                 'data1' : np.random.randn(50000),
                 'data2' : np.random.randn(50000)})

In [274]: %timeit df.ix[df['data1'].argsort()[-3:]]
100 loops, best of 3: 5.62 ms per loop

In [275]: %timeit df.iloc[heapq.nlargest(3, df.index, key=lambda x: df['data1'].iloc[x])]
1 loops, best of 3: 1.03 s per loop
虽然
heapq.nlargest
,但实际上即使对于相当大的数据帧,
argsort
也会更快:

import heapq
import pandas as pd
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a']*10000,
                 'key2' : ['one', 'two', 'one', 'two', 'one']*10000,
                 'data1' : np.random.randn(50000),
                 'data2' : np.random.randn(50000)})

In [274]: %timeit df.ix[df['data1'].argsort()[-3:]]
100 loops, best of 3: 5.62 ms per loop

In [275]: %timeit df.iloc[heapq.nlargest(3, df.index, key=lambda x: df['data1'].iloc[x])]
1 loops, best of 3: 1.03 s per loop

data1
列的值降序排序:

df.sort(['data1'], ascending=False)[:3]

data1
列的值降序排序:

df.sort(['data1'], ascending=False)[:3]

我知道您希望编写一个只返回前3个值的函数,但我不太确定哪3个值是前3个值。你能举一个例子,完全指定(所有数字/字符串,不调用numpy)这个函数的输入和输出吗?我知道你想写一个只返回前3个值的函数,但我不确定哪3个值是前3个值。你能举一个例子,完全指定(所有数字/字符串,不调用numpy)这个函数的输入和输出吗?是!!谢谢你,我花了两个小时才弄明白这一点。不过,我不是100%都是公平的比较——iloc不是在做线性搜索吗?(我对熊猫知之甚少。)@kojiro:
iloc
正在对数组进行整数索引,所以它应该是O(1),而不是O(n)。是的!!谢谢你,我花了两个小时才弄明白这一点。不过,我不是100%都是公平的比较——iloc不是在做线性搜索吗?(我对熊猫知之甚少。)@kojiro:
iloc
正在对数组进行整数索引,因此它应该是O(1),而不是O(n)。在平均情况下,排序应该是O(n lg(n))
heapq.nsmallest
将是获得n个最小值的更有效方法。(当然还有一个
heapq.nlargest
。@kojiro:我不知道。非常感谢!:)在平均情况下,排序为O(nlg(n))
heapq.nsmallest
将是获得n个最小值的更有效方法。(当然还有一个
heapq.nlargest
。@kojiro:我不知道。非常感谢!:)