我知道在熊猫数据帧中循环通常是个坏主意,但在这种情况下,我不知道还能做什么。我有一个名为合并的数据框,格式如下,但行长为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
关于如何改进这件事有什么想法吗?但愿我在计算机科学课上多加注意
决定放弃循环。创建了一个带有所需变量的微型数据帧,对其执行for循环,得到了我需要的结果,并使用左连接将其合并回原始数据帧。快1000倍
相关问题 更多 >
编程相关推荐