2017-05-02 5 views
0

pivot_table 메서드를 사용하여 다른 팬더 데이터 프레임 (상점 별 판매)에서 생성 된 피벗 팬더 데이터 프레임 (지역별 판매)이 있습니다. 예를 들어분기 별 데이터 집계

:

df = pd.DataFrame(
    {'store':['A','B','C','D','E']*7, 
    'region':['NW','NW','SW','NE','NE']*7, 
    'date':['2017-03-30']*5+['2017-04-05']*5+['2017-04-07']*5+['2017-04-12']*5+['2017-04-13']*5+['2017-04-17']*5+['2017-04-20']*5, 
    'sales':[30,1,133,9,1,30,3,135,9,11,30,1,140,15,15,25,10,137,9,3,29,10,137,9,11,30,19,145,20,10,30,8,141,25,25] 
    }) 
df['date'] = pd.to_datetime(df['date']) 
df_sales = df.pivot_table(index = ['region'], columns = ['date'], aggfunc = [np.sum], margins = True) 
df_sales = df_sales.ix[:,range(0, df_sales.shape[1]-1)] 

내 목표는 판매 데이터 프레임에 다음을 수행 df_sales입니다.

분기별로 판매를 요약하는 새 데이터 프레임을 만듭니다. 원본 데이터 프레임 df 또는 sales_df를 사용할 수 있습니다.

2017Q1 2017Q2 
10  27 
31  37.5 
133  139.17 

내가 Q1의 모든 일의 평균을, 그리고 Q2에 대한 같은 : 분기로

여기에서 우리는 같을 것이다에만 두 분기 (USA fiscal calendar year) 그래서 분기 집계 된 데이터 프레임을 가지고있다. 예를 들어 북 동쪽 지역의 경우 'NE' 일 경우 Q1은 2017-03-30 일일 평균 10, 즉 Q2는 2017-04-05에서 2017-04-20까지의 평균입니다. 즉

(20+30+12+20+30+50)/6=27 

제안 사항?

추가 참고 : df_sales 피벗 테이블에서 분기 집계를 수행하는 것이 이상적입니다. 메모리에 보관할 데이터 프레임이 훨씬 작기 때문입니다. 현재의 솔루션은 원래의 df에서 수행하지만, 아직 df_sales 데이터 프레임에서이를 수행 할 방법을 찾고 있습니다.

+0

당신이 작은 샘플 재현 데이터 세트를 게시 할 수 없습니다 ("피벗"전) ('df'와 소스 DF)이 무엇입니까? – MaxU

+0

@MaxU 확실한 예를 만들어 보겠습니다. – Dnaiel

+0

@MaxU 오케이, 전체 예제를 만듭니다. – Dnaiel

답변

1

UPDATE :

설정 :

df.date = pd.to_datetime(df.date) 

df_sales = df.pivot_table(index='region', columns='date', values='sales', aggfunc='sum') 

In [318]: df_sales 
Out[318]: 
date 2017-03-30 2017-04-05 2017-04-07 2017-04-12 2017-04-13 2017-04-17 2017-04-20 
region 
NE    10   20   30   12   20   30   50 
NW    31   33   31   35   39   49   38 
SW    133   135   140   137   137   145   141 

해결 방법 : 원래 DF에 따라

In [319]: (df_sales.groupby(pd.PeriodIndex(df_sales.columns, freq='Q'), axis=1) 
    ...:   .apply(lambda x: x.sum(axis=1)/x.shape[1]) 
    ...:) 
Out[319]: 
date 2017Q1  2017Q2 
region 
NE  10.0 27.000000 
NW  31.0 37.500000 
SW  133.0 139.166667 

솔루션 :

In [253]: (df.groupby(['region', pd.PeriodIndex(df.date, freq='Q-DEC')]) 
    ...: .apply(lambda x: x['sales'].sum()/x['date'].nunique()) 
    ...: .to_frame('avg').unstack('date') 
    ...:) 
    ...: 
Out[253]: 
      avg 
date 2017Q1  2017Q2 
region 
NE  10.0 27.000000 
NW  31.0 37.500000 
SW  133.0 139.166667 

참고 : df - 원하는 데이터 설정 - 원래 DF

+0

정말 대단한 해결책입니다! – Dnaiel

관련 문제