我知道循环遍历Pandas dataframe通常是个坏主意,但在这种情况下,我不知道还能做什么。我有一个名为DataFrame的合并,格式如下,但是有2kk行长。合并时间=合并‘年份’*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我要做的是,如果是选举年,根据下面的计算来标记每一行,并将其余的观察结果保持为NaNs,并将PostElection列从0更改为1,如果下面的条件为true。下面是我的代码的第一次迭代,使用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对如何改进这件事有什么想法吗?希望我在计算机科学课上能多加注意.
发布于 2020-06-11 17:26:38
决定放弃这个循环。创建一个带有所需变量的小型数据帧,在其上执行for循环,获得所需的结果,并使用左联接将其合并回原始数据帧。快1000倍。
https://stackoverflow.com/questions/62328588
复制相似问题