如何通过数据帧优化循环

2024-10-07 16:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在熊猫数据帧中循环通常是个坏主意,但在这种情况下,我不知道还能做什么。我有一个名为合并的数据框,格式如下,但行长为2kk。 合并['time']=合并['year']*4+合并['qtr']

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

我试图做的是,根据下面的计算,将每一行标记为选举年,并将其余观察值保留为NaN,如果以下条件变为真,还将选后列从0更改为1。下面是我的代码的第一次迭代,使用for循环:

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分钟了,还在运行

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

关于如何改进这件事有什么想法吗?但愿我在计算机科学课上多加注意