在 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
我有一个 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