【问题标题】:Pandas Mask Performance熊猫面具表演
【发布时间】:2023-03-16 05:34:01
【问题描述】:

我在处理带有要过滤的大文件的 pandas 时遇到了问题。我测试了这两种形式来进行过滤,其中一种在大约 30% 的时间内完成。我的问题是为什么生成的掩码比在数据框中传递过滤器的性能更好?

我的代码:

import numpy as np
import pandas as pd
import datetime
df = pd.DataFrame({'data':np.random.randint(low=1,high=100,size=10*8), 'data':np.random.randint(low=1,high=100,size=10*8)})

第一种方法

init = datetime.datetime.now()
partial = df[df['data']==5]
final = datetime.datetime.now()
print(len(partial))
print(final-init)

1011055 时间:0:00:00.611047

第二种方法:

init = datetime.datetime.now()
mask == df['data']==5
partial = df[mask]
final = datetime.datetime.now()
print(len(partial))
print(final-init)

1011055 0:00:00.377024

【问题讨论】:

  • datetime.datetime.now() 并非旨在正确测量执行时间。使用模块timeit。你可能会得到非常不同的结果。
  • 你的意思是mask ==?而不是mask =?假设 - 我没有看到任何明显的差异
  • 我在编写代码时犯了两个错字,一个是mask = 符号,另一个是关键数据 df = pd.DataFrame({'data':np.random.randint(low =1,high=100,size=10*8), 'data_b':np.random.randint(low=1,high=100,size=10*8)}),我猜这会影响执行。

标签: python pandas dataframe numpy datetime


【解决方案1】:

我看不出有什么不同:

import pandas as pd
from timeit import timeit

df = pd.DataFrame({'data': np.random.randint(low=1, high=100, size=10*8)})

t1 = timeit("partial = df[df['data'] == 5]", number=10000, globals=globals())
t2 = timeit("mask = (df['data'] == 5); partial = df[mask]", number=10000,
            globals=globals())
print(t1, t2)

结果:

2.363040907 2.3674299340000005

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 2019-09-29
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多