2015-10-05 105 views
3

我有這個foll。據幀:根據往年數據計算大熊貓數據幀行的百分位數

datetime  JD  YEAR VAL 
2000-01-01  1  2000 0.5 
2000-01-02  2  2000 1.2 
2000-01-03  3  2000 2.1 
2000-01-04  4  2000 3.4 
2000-01-05  5  2000 4.6 
2000-01-06  6  2000 6.8 
2000-01-07  7  2000 7.2 
2000-01-08  8  2000 0.2 
2000-01-09  9  2000 0.9 
... 
2010-12-31  365 2014 4.1 

第一年是2000,去年是2010年有沒有閏年(即對應於2月29日沒有行),日期時間是索引列。

我想計算一個新的數據框,從2010年1月1日到2010年12月31日。我希望它包含一個計算2010年1月1日值(VAL)百分位數的列,該數組由10個值組成(2000年1月1日,2001年1月1日... 2009年1月1日)。同樣,2010年1月2日與前幾年的1月2日進行比較....

lyr = df.YEAR.max() # last year i.e. 2010 
cdf = df[df.YEAR == lyr]# Latest year dataframe 
pdf = df[df.index.year < lyr] # Previous years dataframe 

pdf.groupby('JD')['VAL'] 
stats.percentileofscore(pdf['VAL'], cdf['VAL']) 

但是,我不知道如何讓代碼工作。 groupby只返回組,而我需要一個值列表。

回答

8

設置了一個小樣本數據幀:

np.random.seed(1234) 
df = pd.DataFrame({ 'jd': np.tile([1,2],3), 
        'yr': np.repeat([2008,2009,2010],2), 
        'val': np.random.randn(6) }) 

然後,它只是一條線:

df['pctile'] = df.groupby('jd')['val'].rank(pct=True) 

下面是輸出,與sort_values(['jd','val'])

jd  val yr pctile 
4 1 -0.720589 2010 0.333333 
0 1 0.471435 2008 0.666667 
2 1 1.432707 2009 1.000000 
1 2 -1.190976 2008 0.333333 
3 2 -0.312652 2009 0.666667 
5 2 0.887163 2010 1.000000 
分類