在熊猫分组中占总数的滚动百分比

问题描述 投票:1回答:4

我有一个示例熊猫数据框,如下所示:

|       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      |

谢谢

python pandas
4个回答
1
投票

执行groupby然后应用基于cumsumcumsum的自定义函数,但是最后一个仅适用于groupby对象,因此另一种方法是使用cumcount并将新索引用作柜台:

cumcount

0
投票

您可以在这里找到有用的groupby方法:

reset_index

不要忘记导入numpy库


0
投票

这是一种简单的方法,但是接下来如何呢?

reset_index

0
投票

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]]
© www.soinside.com 2019 - 2024. All rights reserved.