gpt4 book ai didi

python - 如何使用 datetime 加速 pandas 中 lambda 的应用方法

转载 作者:太空狗 更新时间:2023-10-30 02:28:33 25 4
gpt4 key购买 nike

我是 Pandas 的新手。

我有一个名为 dlf 的非常简单的数据框,它有一个索引和两列 40k 行。它是这样加载的:

d = pd.DataFrame.from_csv(csvsLocation + 'name.csv', index_col='ID', infer_datetime_format=True)
d['LAST'] = pd.to_datetime(d['LAST'], format = '%d-%b-%y')
d['FIRST'] = pd.to_datetime(d['FIRST'], format = '%d-%b-%y')
dlf = d[['LAST', 'FIRST']]

看起来像这样:

    LAST    FIRST
ID
1 1997-04-17 1991-10-04
3 2009-02-13 1988-07-07
5 2009-10-24 1995-12-06
6 1996-04-31 1989-03-14

运行此应用方法需要 5 秒:

year = 1997
dlf[str(year)] = dlf.apply(lambda row: 1*(year >= row['FIRST'].year and year <= row['LAST'].year), axis=1)

我需要加快速度,因为我打算运行它数百次。

我怀疑问题出在使用 lambda 上。

我做错了什么,和/或我怎样才能加快速度?

最佳答案

解决方案

您可以在两个日期列上通过 dt.year 访问年份:

year = 1999
df[str(year)] = 1 * ((df['FIRST'].dt.year <= year) & (df['LAST'].dt.year >= year))
print(df)

输出:

         LAST      FIRST  1999
ID
1 1997-04-17 1991-10-14 0
3 2009-02-13 1988-07-07 1
5 2009-10-24 1995-10-06 1
6 1996-04-30 1969-03-14 0

您还可以保留 bool 值作为结果:

df[str(year)] = (df['FIRST'].dt.year <= year) & (df['LAST'].dt.year >= year)
print(df)

输出:

         LAST      FIRST   1999
ID
1 1997-04-17 1991-10-14 False
3 2009-02-13 1988-07-07 True
5 2009-10-24 1995-10-06 True
6 1996-04-30 1969-03-14 False

性能

衡量绩效总是很有趣。但是测量可能很棘手。如果我们只使用 4 行的小示例数据框,事情会变得有点慢:

%timeit dlf[str(year)] = dlf.apply(lambda row: 1*(year >= row['FIRST'].year and year <= row['LAST'].year), axis=1)

1000 loops, best of 3: 1.27 ms per loop


%timeit df[str(year)] = 1 * ((df['FIRST'].dt.year <= year) & (df['LAST'].dt.year >= year))

100 loops, best of 3: 1.7 ms per loop

但让我们看一下 40k 行:

big = pd.concat([df] * 10000)

>>> big.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 40000 entries, 1 to 6
Data columns (total 4 columns):
LAST 40000 non-null datetime64[ns]
FIRST 40000 non-null datetime64[ns]
1999 40000 non-null bool
1997 40000 non-null int64
dtypes: bool(1), datetime64[ns](2), int64(1)
memory usage: 1.3 MB

现在我们可以看到显着的加速:

%timeit big[str(year)] = big.apply(lambda row: 1*(year >= row['FIRST'].year and year <= row['LAST'].year), axis=1)

1 loops, best of 3: 6.51 s per loop

%timeit big[str(year)] = 1 * ((big['FIRST'].dt.year <= year) & (big['LAST'].dt.year >= year))

100 loops, best of 3: 8.33 ms per loop

这大约快了 780 倍。

关于python - 如何使用 datetime 加速 pandas 中 lambda 的应用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36514781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com