查询数据帧的最快方法

时间:2013-12-18 23:29:23

标签: python pandas

我想对大熊猫数据帧(数百万行)的行进行聚合运算(求和),这些行由几个固定列(最多10列)的条件决定。这些列只有整数值。

我的问题是我必须进行数千次(~100000次)此操作(查询+聚合)。我认为聚合部分没有太多优化,因为它只是一个简单的总和。执行此任务的最有效方法是什么?有没有什么方法可以在我的条件列上建立一个'索引'来加速每个查询?

2 个答案:

答案 0 :(得分:1)

我会尝试这种方式:

假设您有以下数据框

N = 10000000
df = pd.DataFrame({
    'A':np.random.binomial(1,0.5,N),
    'B':np.random.binomial(2,0.5,N),
    'nume1':np.random.uniform(0,1,N),
    'nume2':np.random.normal(0,1,N)})

然后这样做

tmp = df[['A','B','nume1','nume2']].query('A > 0.5').groupby('B').sum().reset_index()[['B','nume1','nume2']]

的SQL等价物
select B, sum(nume1),sum(nume2)
from df
where A > 0.5
group by B

在我的中等(i7四核,16GB内存)机器上花费少于一秒(926ms,使用%timeit)。

我希望这会有所帮助。

答案 1 :(得分:1)

如果没有更多细节,很难回答你的问题。

您确实应该构建条件列的索引。

df['idx'] = (df['col1'] * df['col2']) ** (df['col3'] + df['col4']) * df['col5'] == 0.012
df = df.set_index('idx')

将条件重写为可索引列可能很难。 请记住,您可以将所有列设置为索引

df = df.set_index(['col1', 'col2', 'col3', 'col4', 'col5' ...])

关于Pandas中高级索引的文档可能会帮助您思考您的问题: http://pandas.pydata.org/pandas-docs/stable/indexing.html#multiindex-query-syntax