通过for循环使用concat / append创建摘要Pandas DataFrame

时间:2014-01-29 18:49:38

标签: python pandas

无法理解这个......

我阅读了一堆电子表格,做了一堆计算,然后想要从每组计算中创建一个摘要DF。我可以创建初始的df但不知道如何控制我的循环以便我

  1. 创建初始DF(第一次循环)
  2. 如果已创建,则为每个附加选项卡附加下一个DF(最后两行)。
  3. 我只是不知道如何创建正确的嵌套循环,以便在完成第一个循环之后,后续的循环会被追加?

    我当前的代码如下所示:(它只是单独地打印每个标签的结果,而不是创建一个新的合并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循环技术: - (

2 个答案:

答案 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