DataFrame惰性求值:Pandas分组计算性能差异及技术疑问
关于Pandas分组聚合性能的问题与解释
先看一个性能对比演示,第二种写法的速度比第一种慢10倍:
import pandas as pd from timeit import default_timer as timer r = range(1,int(1e7)) df = pd.DataFrame({ 'col0': [i % 3 for i in r], 'col1': r }) df['pad'] = '*' * 100 start = time.time() print(df.groupby('col0')['col1'].min()) end = time.time() print(end - start) start = time.time() print(df.groupby('col0').min()['col1']) end = time.time() print(end - start)
运行输出:
col0 0 3 1 1 2 2 Name: col1, dtype: int64 0.14302301406860352 col0 0 3 1 1 2 2 Name: col1, dtype: int64 1.4934422969818115
原因很直观:第二种写法中,Pandas会对所有列(包括pad列)计算min值,而第一种写法只针对col1列计算。
问题解答
- 没办法让Python自动识别第二种写法只需要计算
col1列的聚合值。 - 这属于Pandas的实现限制,而非Python语言本身的限制。因为表达式
df.groupby('col0').min()在执行时,Pandas的分组聚合逻辑会遍历所有列完成计算,生成完整的聚合结果DataFrame之后,才会执行后续的['col1']索引操作。Python的求值顺序是先完成整个表达式的左侧计算,再处理索引,所以没法提前跳过其他列的计算。
内容的提问来源于stack exchange,提问作者Slimboy Fat
相关产品推荐
相关产品推荐

