繁体   English   中英

如何优化循环 Pandas DataFrame

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM