我有一个示例熊猫数据框,如下所示:
| id | success |
|:---------------|--------------:|
| 1 | 0 |
| 1 | 1 |
| 1 | 1 |
| 2 | 0 |
| 2 | 1 |
| 2 | 1 |
对于每组ID,我想找出成功的滚动百分比。对于ID 1,第一个记录成功= 0。因此成功百分比为0。下一行成功=1。因此成功百分比为1/2(1个成功= 1,共2条记录,包括前一行)。下一行成功=1。因此成功百分比为2/3(2个成功1s,3个总记录)。结果表如下:
| id | success | success%. |
|:--------------|--------------:|--------------:|
| 1 | 0 | 0 |
| 1 | 1 | 50 |
| 1 | 1 | 67 |
| 2 | 0 | 0 |
| 2 | 1 | 50 |
| 2 | 1 | 67 |
谢谢
这是一种简单的方法,但是接下来如何呢?
reset_index
将df['rate'] = df.groupby('id')['success'].apply(
lambda serie: serie.cumsum()/(serie.reset_index().index + 1)*100).\
round(0).astype(int)
df.rate
# 0 0
# 1 50
# 2 67
# 3 0
# 4 50
# 5 67
和groups = df.groupby("id")
dataframes = []
for name, gdf in groups:
# gdf is a group of ids (a df)
gdf['cumsum'] = np.cumsum(gdf['success'])
gdf['count'] = list(range(1, len(gdf)+1))
gdf['%'] = gdf['cumsum']/ gdf['count']
dataframes.append(gdf)
df = pd.concat(dataframes)
用作:
df['succcess_cnt'] = df.groupby(['id'])['success'].cumsum()
df['try_cnt'] = 1
df['try_cumsum'] = df.groupby(['id'])['try_cnt'].cumsum()
df['success%'] = df['try_cnt'] / df['try_cumsum']
df = df.iloc[:,[0,1,5]]