2014-06-17 4 views
0

파이썬 2.7을 사용 중이며 데이터 프레임에서 몇 개월 동안 특정 요약 메트릭을 작성 중입니다. 각 평균 (jan_avg_prod_count, feb_avg_prod_count, etc ...)은 출력 파일에 추가됩니다.for 루프 내에서 변수를 만들어 데이터 프레임을 할당하는 방법은 무엇입니까?

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 사전에 하위 집합 데이터 프레임이 채워집니다.

내가하고있는 일이 정확하지 않다는 것을 이해합니다. 월간 데이터 프레임을 만드는 방법을 모르겠습니다. 조언이나 새로운 방향에 감사드립니다.

+0

* "올바르게 작동하지 않습니다."* 정확히 무엇을 의미합니까? 예제를 제공 할 수 있습니까? – jonrsharpe

+0

예제를 정리하고 출력을 추가했습니다. – analyticsPierce

+0

'df.groupby ([ 'month_num', 'prod_desc'])의 문제점은 무엇입니까? – U2EF1

답변

1

을 작동하는 경우 열 이름이 jan_avg_prod_count, feb_avg_prod_count 인 다른 데이터 프레임을 얻는 등 ... 루프보다 빠르며 사전보다 사용하기 쉽습니다. 당신이 'jan_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 

, 당신은 사전처럼 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 

합니다.

루프가 느려서 할 수 있으면 피해야합니다.

+0

나는 귀하의 접근 방식을 좋아하고 그것을 시도하고 있습니다. 그래도 다음과 같은 오류가 발생합니다 : TypeError : pivot_table() 예기치 않은 키워드 인수 'columns'가 있습니다. – analyticsPierce

+0

감사합니다. 이 마지막 pivot_table 문은 필자가 필요로하는 것과 정확히 일치합니다. pt = df.pivot_table (cols = '월', 값 = 'prod_count', aggfunc = 평균) – analyticsPierce

0

유스 케이스에 맞는지는 잘 모르지만 각 키가 '월'인 데이터 프레임 사전을 만들고 싶을 수 있습니다. dataframes [ '얀'] 당신에게 1월에 대한 dataframe .. 등

을 제공 그래서 나는 당신의 df에 pivot_table 일을 생각 ... 당신이 뭔가를 할 수있는 다음

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