我有一个示例熊猫数据框,如下所示:
| 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个成功1秒,共3条记录)。 结果表如下:
| id | success | success%. |
|:--------------|--------------:|--------------:|
| 1 | 0 | 0 |
| 1 | 1 | 50 |
| 1 | 1 | 67 |
| 2 | 0 | 0 |
| 2 | 1 | 50 |
| 2 | 1 | 67 |
谢谢
答案 0 :(得分:2)
执行groupby
然后应用基于cumsum
和cumcount
的自定义函数,但是最后一个仅适用于groupby对象,因此另一种方法是{{3 }},并使用新索引作为计数器:
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
答案 1 :(得分:2)
将groupby.cumsum
与groupby.cumcount
一起使用:
df['success'] = (df.groupby('id')['success'].cumsum()\
.div(df.groupby('id').cumcount()+1)*100)\
.round(0).astype(int)
print(df)
id success
0 1 0
1 1 50
2 1 67
3 2 0
4 2 50
5 2 67
答案 2 :(得分:0)
您可以在这里找到有用的groupby方法:
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)
别忘了导入numpy库
答案 3 :(得分:0)
这是一种简单的方法,但是接下来呢
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]]