我有一个值列表
说
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的前三个值并返回所有4列
除了我想到的很多if语句之外,最好的方法是做什么。
我正在寻找最大的,但不知道我怎么能这样做
======================== update ====================== ===
所以如果在上面运行就会得到这个结果
我想得到返回df只有1,2,3的rowindex因为他们拥有最高的前3名数据1(98,94,95)
答案 0 :(得分: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
may be theoretically more efficient,但实际上即使对于相当大的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
答案 1 :(得分:1)
按data1
列的值降序排序:
df.sort(['data1'], ascending=False)[:3]