首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Pandas DataFrame优化循环

如何通过Pandas DataFrame优化循环
EN

Stack Overflow用户
提问于 2020-06-11 16:05:19
回答 1查看 77关注 0票数 0

我知道循环遍历Pandas dataframe通常是个坏主意,但在这种情况下,我不知道还能做什么。我有一个名为DataFrame的合并,格式如下,但是有2kk行长。合并时间=合并‘年份’*4+合并‘’qtr‘

代码语言:javascript
复制
year    qtr   time  election_year   PostElection
1976    1     7905      NaN                0
1976    2     7906      NaN                0
1976    3     7907      NaN                0
1976    4     7908      NaN                0
1977    1     7909      NaN                0
1977    2     7910      NaN                0
1977    3     7911      NaN                0
1977    4     7912      NaN                0

我要做的是,如果是选举年,根据下面的计算来标记每一行,并将其余的观察结果保持为NaNs,并将PostElection列从0更改为1,如果下面的条件为true。下面是我的代码的第一次迭代,使用for循环:

代码语言:javascript
复制
elect_yrs = list(range(1976,2017,4))
for i, year in enumerate(merged.year):

    if year in elect_yrs and merged.loc[i, 'time'] > (year*4-3) and merged.loc[i, 'time'] <= (year*4+10) and merged.loc[i, 'time'] != (year*4+4):
        merged.loc[i, 'election_year'] = year

    if merged.loc[i, 'time'] > (year*4+4) and merged.loc[i, 'time'] <= (year*4+10):
        merged.loc[i, 'PostElection'] = 1

它非常慢。我等了半小时就放弃了。做了一个计数器,只是为了看看数字增长的速度,不是快,而是起作用。我的第二个迭代是使用zip函数。我在某个地方读到它比for循环快四倍。根据计数器的速度,它是更快,但仍然需要很多时间。现在已经过了20分钟了,还在跑。

代码语言:javascript
复制
elect_yrs = list(range(1976,2017,4))
for year,time,i in zip(merged['year'], merged['time'], range(len(merged))):
    if year in elect_yrs and time > (year*4-3) and time <= (year*4+10) and time != (year*4+4):
        merged.loc[i, 'election_year'] = year
    if time > (year*4+4) and time <= (year*4+10):
        merged.loc[i, 'PostElection'] = 1

对如何改进这件事有什么想法吗?希望我在计算机科学课上能多加注意.

EN

回答 1

Stack Overflow用户

发布于 2020-06-11 17:26:38

决定放弃这个循环。创建一个带有所需变量的小型数据帧,在其上执行for循环,获得所需的结果,并使用左联接将其合并回原始数据帧。快1000倍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62328588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档