2

我有一个价值清单

df = DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
   ....:                 'key2' : ['one', 'two', 'one', 'two', 'one'],
   ....:                 'data1' : abs(np.random.randn(5)*100),
   ....:                 'data2' : np.random.randn(5)})

所以如果这是我的数据,

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

除了我想到的很多 if 语句之外,最好的方法是什么。

我正在调查 nlargest ,但不知道我该怎么做

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

所以如果上面运行会得到这个结果

在此处输入图像描述

我想获得只有 rowindex 为 1,2,3 的返回 df,因为它们在 data1 的前 3 名中排名最高( 98,94,95 )

4

2 回答 2

3
In [271]: df
Out[271]: 
      data1     data2 key1 key2
0 -1.318436  0.829593    a  one
1  0.172596 -0.541057    a  two
2 -2.071856 -0.181943    b  one
3  0.183276 -1.889666    b  two
4  0.558144 -1.016027    a  one

In [272]: df.ix[df['data1'].argsort()[-3:]]
Out[272]: 
      data1     data2 key1 key2
1  0.172596 -0.541057    a  two
3  0.183276 -1.889666    b  two
4  0.558144 -1.016027    a  one

虽然heapq.nlargest 理论上可能更有效,但实际上即使对于相当大的 DataFrame,也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
于 2013-10-13T20:55:03.167 回答
1

data1列值降序排序:

df.sort(['data1'], ascending=False)[:3]
于 2013-10-13T21:02:18.310 回答