我有一个包含数百万行和A1,..., AN列的pandas数据框df。
选择使得 df['A1']==30
的行,最快的方法是什么?
注:至少有三种方法:
- 方法一:
df[(df['A1']==30)]
- 方法二:
df.query('A1==30')
- 方法三:执行
df = df.set_index(A1)
一次;然后使用df.loc[30]
(或对于我们要定位在A1列中的所有x值,使用df.loc[x]
)
它们各自的优缺点是什么?
5000万行和52列
from string import ascii_letters
df = pd.DataFrame(np.random.randint(50, size=(50000000, 52)), columns=list(ascii_letters))
多种方法
%timeit df[df.B == 30]
%timeit df[df.B.values == 30]
%timeit df.query('B == 30')
1 loop, best of 3: 31.4 s per loop
1 loop, best of 3: 31.6 s per loop
1 loop, best of 3: 27.1 s per loop
numexpr
import numexpr as ne
%%timeit
B = df.B.values
df[ne.evaluate('B == 30')]
1 loop, best of 3: 22.8 s per loop
或者使用 numpy
切片以及 numexpr
重新构建整个内容。
%%timeit
B = df.B.values
mask = ne.evaluate('B == 30')
pd.DataFrame(df.values[mask], df.index[mask], df.columns)
1 loop, best of 3: 21.4 s per loop