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

Python 如何在for循环中创建变量以分配数据帧?,python,pandas,Python,Pandas,我使用的是Python2.7,并从数据框架中按月创建一些特定的汇总指标。然后将每个平均值(一月平均产量计数、二月平均产量计数等)添加到输出文件中 My main df: month_num prod_desc prod_count 01 A 52 01 B 43 01 C 38 02 A 21 02

我使用的是Python2.7,并从数据框架中按月创建一些特定的汇总指标。然后将每个平均值(一月平均产量计数、二月平均产量计数等)添加到输出文件中

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
我所追求的是每月汇总数据帧中的平均生产数量。现在,我每月手动汇总以下内容,并每月重复:

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]
上面生成了一个包含正确值的字典,但对子集dataframe的赋值不正确

如果我打印每月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
我明白我所做的是不正确的。我只是不知道如何创建每月的数据帧。
如有任何建议或新方向,我们将不胜感激

不确定它是否适合您的用例,但您可能希望制作数据帧字典,其中每个键都是“月”。所以dataframes['jan']为您提供一月的数据帧。。等等

如果这行得通的话,你可以做一些像

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

我想在
df
上做一个pivot\u表,然后获得另一个数据帧,列名为
jan\u avg\u prod\u count,feb\u avg\u prod\u 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
给你一个熊猫系列


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

“不能正常工作”-这到底是什么意思?你能提供一些例子吗?我清理了我的例子并添加了一些输出。
df.groupby(['month\u num',prod\u desc'])
有什么问题吗?groupby方法不会为每个月生成单独的指标。我喜欢你的方法,正在尝试。但是我得到了以下错误:TypeError:pivot_table()得到了一个意外的关键字参数'columns',谢谢。最后一个pivot_table语句正好满足了我的需要。pt=df.pivot\u表(cols='month',values='prod\u count',aggfunc=mean)