【问题标题】:How to create variables inside a for loop to assign dataframes?如何在 for 循环中创建变量来分配数据帧?
【发布时间】:2014-06-18 09:40:29
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • “无法正常工作” - 这究竟是什么意思?你能提供例子吗?
  • 我清理了我的示例并添加了一些输出。
  • df.groupby(['month_num', 'prod_desc']) 有什么问题?
  • groupby 方法不会为每个月生成单独的指标。

标签: python pandas


【解决方案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

给你一个熊猫系列。

应该尽量避免循环,因为它很慢。

【讨论】:

  • 我喜欢你的方法并正在尝试。我收到以下错误:TypeError: pivot_table() got an unexpected keyword argument 'columns'
  • 谢谢。最后一个 pivot_table 语句得到了我所需要的。 pt = df.pivot_table(cols='month',values='prod_count', aggfunc=mean)
【解决方案2】:

不确定它是否适合您的用例,但您可能想要制作数据框字典,其中每个键都是“月份”。所以 dataframes['jan'] 给你一月份的数据框..等等..

如果这样可行,那么您可以执行类似...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多