我正在使用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
我明白我在做什么是不正确的。我只是不确定如何创建月度数据帧。 任何建议或新方向表示赞赏。
答案 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)}