[英]How to optimize looping through Pandas DataFrame
我知道循环遍历 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
我想做的是,如果是选举年,每行 label,基于下面的计算,并将观察的 rest 保留为 NaN,如果以下条件为真,则将 PostElection 列从 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 function。我在某处读到它比 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
关于如何改进这件事的任何想法? 希望我在计算机科学方面多加注意 class ......
决定放弃循环。 创建了一个带有所需变量的微型 dataframe,对其执行 for 循环,得到我需要的结果并使用左连接将其合并回原始 dataframe。 快 1000 倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.