2016-07-02 2 views
4

"날짜"와 "숫자"열이있는 데이터 프레임이 있습니다.주별 팬더 데이터 프레임 나누기

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd') 
nums = [np.random.randint(100) for x in range(len(dates))] 

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums}) 
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')] 
df = df.drop([7,18]).reset_index(drop = True) 

각 주를 별도로 분리 할 수 ​​있도록 데이터 프레임을 비울 필요가 있습니다. 궁극적 인 목표는 매주 MAX의 'Nums'값을보고 다음 주 마지막 값과 비교하여 변화가 무엇인지 확인하는 것입니다. 예를 들어 :

week1 = df[0:5] 
week2 = df[5:9] 
week3 = df[9:12] 

In [156]: w1max = week1.Nums.max() 
Out[156]: 97 

In [157]: w2Last = week2.iloc[-1].Nums 
Out[157]: 76 

pctChange = (w2Last-w1max)/float(w1max) 

In [166]: pctChange 
Out[166]: -0.21649484536082475 

문제는 몇 주는 일을 누락 (예 : week2은 월요일 누락 및 week3 금요일 누락)이다. 그럼 어떻게 그들을 분리합니까?

가장 가까운 것은 df.resample()을 사용하는 것 같지만 비교를하는 방법을 사용하는 것을 시도하고 있습니다.

답변

5
import numpy as np 
import pandas as pd 
np.random.seed(2016) 

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd') 
nums = [np.random.randint(100) for x in range(len(dates))] 

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums}) 
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')] 
df = df.drop([7,18]).reset_index(drop = True) 

df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last']) 
df2['previous_max'] = df2['max'].shift(1) 
df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max'] 
print(df2.head()) 

pd.Grouper object

  max last previous_max change 
Dates           
2001-01-07 83 39   NaN  NaN 
2001-01-14 75 75   83.0 -0.096386 
2001-01-21 97 18   75.0 -0.760000 
2001-01-28 72 37   97.0 -0.618557 
2001-02-04 84 24   72.0 -0.666667 

df.groupby가 주 그룹으로 행을 사용할 수 산출한다. 당신은 찾을 agg 방법을 사용할 수 있습니다 모두 max 각 그룹의 Numslast 값 :

In [165]: df2['previous_max'] = df2['max'].shift(1); df2.head() 
Out[165]: 
      max last previous_max 
Dates        
2001-01-07 83 39   NaN 
2001-01-14 75 75   83.0 
2001-01-21 97 18   75.0 
2001-01-28 72 37   97.0 
2001-02-04 84 24   72.0 

:

In [163]: df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last']) 

In [164]: df2.head() 
Out[164]: 
      max last 
Dates     
2001-01-07 83 39 
2001-01-14 75 75 
2001-01-21 97 18 
2001-01-28 72 37 
2001-02-04 84 24 

그런 다음 한 행으로 max 값을 아래로 이동하는 shift(1)를 사용 그런 다음 백분율 변화는 간단한 빼기 및 나누기로 계산할 수 있습니다.

In [166]: df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max']; df2.head() 
Out[166]: 
      max last previous_max change 
Dates           
2001-01-07 83 39   NaN  NaN 
2001-01-14 75 75   83.0 -0.096386 
2001-01-21 97 18   75.0 -0.760000 
2001-01-28 72 37   97.0 -0.618557 
2001-02-04 84 24   72.0 -0.666667 
+0

똑똑하고, .shift와 .Grouper에 대해 몰랐다. – RSHAP