我想对大熊猫数据帧(数百万行)的行进行聚合运算(求和),这些行由几个固定列(最多10列)的条件决定。这些列只有整数值。
我的问题是我必须进行数千次(~100000次)此操作(查询+聚合)。我认为聚合部分没有太多优化,因为它只是一个简单的总和。执行此任务的最有效方法是什么?有没有什么方法可以在我的条件列上建立一个'索引'来加速每个查询?
答案 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