Python 如何在for循环中创建变量以分配数据帧?
我使用的是Python2.7,并从数据框架中按月创建一些特定的汇总指标。然后将每个平均值(一月平均产量计数、二月平均产量计数等)添加到输出文件中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
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)