如何在for循环中创建变量来分配数据帧?

时间:2014-06-17 21:48:41

标签: python pandas

我正在使用Python 2.7,并且每月都会从数据框创建一些特定的摘要指标。然后将每个平均值(jan_avg_prod_count,feb_avg_prod_count等等)添加到输出文件中。

My main df:

month_num     prod_desc    prod_count
01             A            52
01             B            43
01             C            38
02             A            21
02             B            24
02             c            18

我所追求的是按月汇总数据框架中的平均prod_count。现在,我手动汇总每个月的以下内容并重复每个月:

jan_df = df[df.month_num == '01']
jan_df = df.groupby(['prod_desc']).agg({'prod_count': np.mean})
jan_df = df.rename(columns = {'prod_count':'jan_avg_prod_count'})

我想要做的是把它放在一个循环中,所以我只有一个代码块。我的方法是按照上面的每个月循环范围1-12和子集我的主df。但是,我仍然坚持如何创建数据帧并将其分配给动态变量名称。

我正在尝试创建正确数据帧的字典,然后分配它们。

month_dfs = {}
for x in range(1,13):
    month_dfs[x] = "%s_df" % calendar.month_abbr[x].lower()
    loop_month_num = '{num:02d}'.format(num = x)
    month_dfs[x] = df[df.month_num == loop_month_num]

以上内容生成了正确值的字典,但子集数据帧的分配无法正常工作。

如果我打印month_dfs,我会得到我期望的结果:

jan_df
feb_df
mar_df
apr_df
may_df
jun_df
jul_df
aug_df
sep_df
oct_df
nov_df
dec_df

然而,jan_df没有被创建。而是使用子集数据帧填充month_dfs字典。

>>> month_dfs[x]
  month_num prod_desc prod_count
3        02         A         21
4        02         B         24
5        02         C         18

我明白我在做什么是不正确的。我只是不确定如何创建月度数据帧。 任何建议或新方向表示赞赏。

2 个答案:

答案 0 :(得分:1)

我认为在df上执行pivot_table并获取另一个包含列名jan_avg_prod_count, feb_avg_prod_count等的数据框...比循环更快,比字典更容易使用。

In [35]: df['month'] = df.month_num.map(lambda n: calendar.month_abbr[int(n)].lower())+'_avg_prod_count'

In [36]: df
Out[36]: 
  month_num prod_desc  prod_count               month
0        01         A          52  jan_avg_prod_count
1        01         B          43  jan_avg_prod_count
2        01         C          38  jan_avg_prod_count
3        02         A          21  feb_avg_prod_count
4        02         B          24  feb_avg_prod_count
5        02         C          18  feb_avg_prod_count

In [37]: pt = df.pivot_table(columns='month',index='prod_desc',values='prod_count', aggfunc=sum)

In [38]: pt
Out[38]: 
month      feb_avg_prod_count  jan_avg_prod_count
prod_desc                                        
A                          21                  52
B                          24                  43
C                          18                  38

如果你想获得'jan_avg_prod_count',你可以像字典一样使用pt

In [39]: pt['jan_avg_prod_count']
Out[39]: 
prod_desc
A            52
B            43
C            38
Name: jan_avg_prod_count, dtype: int64

给你一个熊猫系列。

如果可以,应该避免循环,因为它很慢。

答案 1 :(得分:0)

不确定它是否适合您的使用案例,但您可能希望制作数据帧字典,其中每个键都是“月份”。因此,数据帧['jan']为您提供了1月份的数据帧等。

如果这样可行,那么你可以做一些像......

months = ['jan','feb','mar', ...]
dataframes = {month:pandas.DataFrame(df[df['month_num']==index]) \
              for month,index in zip(months, range(1,13)}