给定一个pandas数据集包含800万行和20列。在
程序查询数据集以查找某列的平均值。在
基于其他列选择的平均值
需要帮助以获得对10k查询的快速响应并减少查询执行时间
设置:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': ['A1','A2','A3','A4','A5','A2','A2','A1','A4','A4'],
'B': ['BA1','BA2','BA3','BA4','BA5','BA2','BA2','BA1','BA4','BA4'],
'C': ['CA1','CA2','CA3','CA4','CA5','CA2','CA2','CA1','CA4','CA4'],
'D': ['D1','D2','D3','D4','D5','D2','D2','D1','D4','D4'],
'important_col': [randint(1, 9)*100 for x in xrange(10)]})
数据集示例:
^{pr2}$查询示例:
df[(df['A']== 'A1')]['important_col'].mean()
df[(df['A']== 'A2') & (df['B'] == 'BA2')]['important_col'].mean()
df[(df['A']== 'A4') & (df['C'] == 'CA4') & (df['D'] == 'D4')]['important_col'].mean()
索引有助于解决问题吗?是否可以使用.loc
或{
列A到D可以转换为类别,因为这些值是非唯一的和有限的。在
下面的例子是基于你在作业中提供的测向
您应该看到内存使用的好处(值被整数替换并使用小的查找表进行映射)以及选择时的速度(基于整数值的查找将比使用字符串值的相同查找更快)。在
更新
我创建了一个Jupyter notebook来展示将列转换为类别的改进。在
使用1.000.000行的样本(与OP定义的结构相同)和OP中提供的示例查询,内存使用率得到了显著提高,因为内存大小从232.7MB下降到11.4MB(减少了95%)。在
此外,示例查询还显示了速度优势:
我用800万个样本做了同样的测试,结果同样提高了速度和资源利用率。在
@Kristof的答案是一个很好的起点。我注意到这个建议的速度提高了不到2倍。对于大型数据帧,还有一些需要记住的事情是使用表达式的顺序(例如,您需要创建一个新的数据帧来选择一个序列,还是可以直接生成新的序列)。当不需要富熊猫方法时,也可以直接使用numpy类型。在
扩展您的示例:
相关问题 更多 >
编程相关推荐