我的数据是这样的:
d = {
'date' : ['2011-01-01', '2011-01-15', '2011-08-14', '2012-01-01', '2012-06-06', '2013-01-01', '2013-02-01','2013-03-01','2013-04-01', '2013-08-25']
,'year' : ['2011','2011','2011','2012','2012','2013','2013','2013','2013', '2013']
}
df = pd.DataFrame(d)
df['date'] = pd.to_datetime(df['date'])
df.sort_values('date', inplace= True)
date year
0 2011-01-01 2011
1 2011-01-15 2011
2 2011-08-14 2011
3 2012-01-01 2012
4 2012-06-06 2012
5 2013-01-01 2013
我如何为每年创建一个订单百分比,一年的第一次出现是0.0,而最后一个出现是1.0?
输出必须是这样的:
date year percent
0 2011-01-01 2011 0.00
1 2011-01-15 2011 0.50
2 2011-08-14 2011 1.00
3 2012-01-01 2012 0.00
4 2012-06-06 2012 1.00
5 2013-01-01 2013 0.00
6 2013-02-01 2013 0.25
7 2013-03-01 2013 0.50
8 2013-04-01 2013 0.75
9 2013-08-25 2013 1.00
我能够通过每年创建几个单独的数据帧并进行apply
的功能来实现这一点,在该功能中,我将每个索引除以len(serie)
,但是由于创建的数据帧数量众多,这似乎并不高效
答案 0 :(得分:3)
您需要使用groupby
并计算(1)cumcount
和(2)size
,然后将两者除。
grp = df.groupby('year')
df['percent'] = grp.cumcount() / (grp['year'].transform('size') - 1)
df
date year percent
0 2011-01-01 2011 0.00
1 2011-01-15 2011 0.50
2 2011-08-14 2011 1.00
3 2012-01-01 2012 0.00
4 2012-06-06 2012 1.00
5 2013-01-01 2013 0.00
6 2013-02-01 2013 0.25
7 2013-03-01 2013 0.50
8 2013-04-01 2013 0.75
9 2013-08-25 2013 1.00