我有以下数据框:
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日的行),datetime是索引列。
我想计算一个新的数据帧,从2010年1月1日到2010年12月31日。我希望它包含一个列,用于计算由10个值组成的数组中2010年1月1日的百分位值(VAL)( 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只返回组,而我需要一个值列表。
答案 0 :(得分:7)
使用小样本数据框进行设置:
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