无法理解这个......
我阅读了一堆电子表格,做了一堆计算,然后想要从每组计算中创建一个摘要DF。我可以创建初始的df但不知道如何控制我的循环以便我
我只是不知道如何创建正确的嵌套循环,以便在完成第一个循环之后,后续的循环会被追加?
我当前的代码如下所示:(它只是单独地打印每个标签的结果,而不是创建一个新的合并sumdf,只包含每个标签结果的最后两行..
#make summary
area_tabs=['5','12']
for area_tabs in area_tabs:
actdf,aname = get_data(area_tabs)
lastq,fcast_yr,projections,yrahead,aname,actdf,merged2,mergederrs,montdist,ols_test,mergedfcst=do_projections(actdf)
sumdf=merged2[-2:]
sumdf['name']= aname #<<< I'll be doing a few more calculations here as well
print sumdf
仍然是一个新的学习基本python循环技术: - (
答案 0 :(得分:1)
在for循环之外进行初始化。像这样:
#make summary
area_tabs=['5','12']
if not area_tabs:
return # nothing to do
# init the first frame
actdf,aname = get_data(area_tabs[0])
lastq,fcast_yr,projections,yrahead,aname,actdf,merged2,mergederrs,montdist,ols_test,mergedfcst =do_projections(actdf)
sumdf=merged2[-2:]
sumdf['name']= aname
for area_tabs in area_tabs[1:]:
actdf,aname = get_data(area_tabs)
lastq,fcast_yr,projections,yrahead,aname,actdf,merged2,mergederrs,montdist,ols_test,mergedfcst =do_projections(actdf)
sumdf=merged2[-2:]
sumdf['name']= aname #<<< I'll be doing a few more calculations here as well
print sumdf
您可以通过将常用步骤放入函数中来进一步改进代码。
答案 1 :(得分:1)
通常比编写循环更简洁,特别是如果你打算使用结果,那就是对函数使用列表理解:
def get_sumdf(area_tab): # perhaps you can name better?
actdf,aname = get_data(area_tab)
lastq,fcast_yr,projections,yrahead,aname,actdf,merged2,mergederrs,montdist,ols_test,mergedfcst=do_projections(actdf)
sumdf=merged2[-2:]
sumdf['name']= aname #<<< I'll be doing a few more calculations here as well
return sumdf
[get_sumdf(area_tab) for area_tab in areas_tabs]
和concat:
pd.concat([get_sumdf(area_tab) for area_tab in areas_tabs])
或者您也可以使用生成器表达式:
pd.concat(get_sumdf(area_tab) for area_tab in areas_tabs)
为了解释我的评论,重新命名为元组和字典,我认为这行很难阅读并且很容易出错:
lastq,fcast_yr,projections,yrahead,aname,actdf,merged2,mergederrs,montdist,ols_test,mergedfcst=do_projections(actdf)
一个技巧是让do_projections
返回一个命名元组,而不是一个元组:
from collections import namedtuple
Projection = namedtuple('Projection', ['lastq', 'fcast_yr', 'projections', 'yrahead', 'aname', 'actdf', 'merged2', 'mergederrs', 'montdist', 'ols_test', 'mergedfcst'])
然后在 do_projections
:
return (1, 2, 3, 4, ...) # don't do this
return Projection(1, 2, 3, 4, ...) # do this
return Projection(last_q=last_q, fcast_yr=f_cast_yr, ...) # or this
我认为这可以避免错误并且更加清晰,尤其是稍后访问结果。
projections = do_projections(actdf)
projections.aname