gpt4 book ai didi

python - 为什么 dataframe.appy 花费太多时间

转载 作者:行者123 更新时间:2023-12-01 03:35:21 25 4
gpt4 key购买 nike

我有一个数据框“df_ret_temp”

enter image description here

enter image description here我想设置列 accMonth 值。有代码运行速度快

df_ret_temp.loc[df_ret_temp['tradeDate'].str[5:7]<='03','accMonth']=df_ret_temp['tradeDate'].str[0:4].apply(lambda x:str(int(x)-1))+'12'
df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='06') &
(df_ret_temp['tradeDate'].str[5:7]>'03'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'03'

df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='09') &
(df_ret_temp['tradeDate'].str[5:7]>'06'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'06'

df_ret_temp.loc[(df_ret_temp['tradeDate'].str[5:7]<='12') &
(df_ret_temp['tradeDate'].str[5:7]>'09'),'accMonth']=df_ret_temp['tradeDate'].str[0:4]+'09'

但是,当我使用 apply 函数设置列 accMonth 值时。代码花费了太多时间。

def df_ret_tempFun(row):
if row['tradeDate'][5:7]<='03':
row['accMonth']=str(int(row['tradeDate'][0:4])-1)+'12'
elif row['tradeDate'][5:7]<='06' and row['tradeDate'][5:7]>'03':
row['accMonth']=row['tradeDate'][0:4]+'03'
elif row['tradeDate'][5:7]<='09' and row['tradeDate'][5:7]>'06':
row['accMonth']=row['tradeDate'][0:4]+'06'
else:
row['accMonth']=row['tradeDate'][0:4]+'09'
return row
df_ret_temp=df_ret_temp.apply(df_ret_tempFun,axis=1)

为什么apply函数的性能较低。

最佳答案

.apply(..., axis=1) 是一个 for x in df.iter* 循环,因此它不是矢量化的,因此是 <强>非常慢。

但是你的问题是 XY problem 的一个很好的例子。

这是针对您的“未询问”问题的 Pandas 解决方案:

In [33]: x
Out[33]:
Date
0 2007-01-01
1 2007-04-02
2 2007-08-03
3 2007-11-04

In [34]: x.dtypes
Out[34]:
Date object
dtype: object

首先确保您的Date列的datetime数据类型:

In [35]: x.Date = pd.to_datetime(x.Date)

In [36]: x.dtypes
Out[36]:
Date datetime64[ns]
dtype: object

矢量化解决方案:

In [37]: x['accMonth'] = pd.PeriodIndex(pd.PeriodIndex(df.Date, freq='Q') - 1, freq='3M')

In [38]: x
Out[38]:
Date accMonth
0 2007-01-01 2006-12
1 2007-04-02 2007-03
2 2007-08-03 2007-06
3 2007-11-04 2007-09

关于python - 为什么 dataframe.appy 花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434879/

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