大熊猫总滚动百分比

时间:2020-05-01 01:56:39

标签: python pandas

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

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

谢谢

4 个答案:

答案 0 :(得分:2)

执行groupby然后应用基于cumsumcumcount的自定义函数,但是最后一个仅适用于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.cumsumgroupby.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]]