在 pandas 数据框中查找拒绝百分比

Finding percentage of rejection in pandas dataframe

我有一个 pandas 数据框,如下所示

Id1     YEAR    CLAIM_STATUS   no_of_claims
 1  2019-01       4               1
 1  2019-01       5               1
 1  2019-02       4               1
 1  2019-02       5               1
 1  2019-03       4               6
 1  2019-03       5               2
 1  2019-04       5               1
 1  2019-04       6               1
 1  2019-05       5               2
 1  2019-06       4               1
 1  2019-06       5               1

这里 claim_STATUS 状态 4 表示索赔被拒绝 我需要找到每年每个 Id1 的索赔被拒绝的百分比,其中被拒绝的索赔百分比计算如下

claim-status-4/(claim-status-4+claim-status-5+claim-status-6)

在上面 table 声明被拒绝的百分比是 (1/(1+6+3))*100 = 10%

我需要将上面的数据帧转换为下面给出的输出:

Id1   YEAR_MO    % of claims rejected
1   2019-01         50%
1   2019-02         50%
1   2019-03         75%
1   2019-04         0%
1   2019-05         0%
1   2019-06         50%

测试列 claim_STATUS 并分配回去,聚合 sum 和最后划分列:

print (df.assign(CLAIM_STATUS = df['CLAIM_STATUS'].eq(4).mul(df['no_of_claims'])))
    Id1     YEAR  CLAIM_STATUS  no_of_claims
0     1  2019-01             1             1
1     1  2019-01             0             1
2     1  2019-02             1             1
3     1  2019-02             0             1
4     1  2019-03             6             6
5     1  2019-03             0             2
6     1  2019-04             0             1
7     1  2019-04             0             1
8     1  2019-05             0             2
9     1  2019-06             1             1
10    1  2019-06             0             1

df = (df.assign(CLAIM_STATUS = df['CLAIM_STATUS'].eq(4).mul(df['no_of_claims']))
        .groupby(['Id1','YEAR'], as_index=False).sum())

print (df)
   Id1     YEAR  CLAIM_STATUS  no_of_claims
0    1  2019-01             1             2
1    1  2019-02             1             2
2    1  2019-03             6             8
3    1  2019-04             0             2
4    1  2019-05             0             2
5    1  2019-06             1             2

#used pop for divide and drop columns
df['% of claims rejected'] = df.pop('CLAIM_STATUS').div(df.pop('no_of_claims')).mul(100)
print (df)
   Id1     YEAR  % of claims rejected
0    1  2019-01                  50.0
1    1  2019-02                  50.0
2    1  2019-03                  75.0
3    1  2019-04                   0.0
4    1  2019-05                   0.0
5    1  2019-06                  50.0

编辑:

为了更好地调试可以使用:

df = (df.assign(new = df['CLAIM_STATUS'].eq(4).mul(df['no_of_claims']))
        .groupby(['Id1','YEAR'], as_index=False).sum())

print (df)
   Id1     YEAR  CLAIM_STATUS  no_of_claims  new
0    1  2019-01             9             2    1
1    1  2019-02             9             2    1
2    1  2019-03             9             8    6
3    1  2019-04            11             2    0
4    1  2019-05             5             2    0
5    1  2019-06             9             2    1

df['% of claims rejected'] = df['new'].div(df['no_of_claims']).mul(100)
print (df)
   Id1     YEAR  CLAIM_STATUS  no_of_claims  new  % of claims rejected
0    1  2019-01             9             2    1                  50.0
1    1  2019-02             9             2    1                  50.0
2    1  2019-03             9             8    6                  75.0
3    1  2019-04            11             2    0                   0.0
4    1  2019-05             5             2    0                   0.0
5    1  2019-06             9             2    1                  50.0


df = df.drop(['no_of_claims','CLAIM_STATUS','new'], axis=1)
print (df)
   Id1     YEAR  % of claims rejected
0    1  2019-01                  50.0
1    1  2019-02                  50.0
2    1  2019-03                  75.0
3    1  2019-04                   0.0
4    1  2019-05                   0.0
5    1  2019-06                  50.0