我有一个Pandas数据框,其中对我来说有趣的功能称为Tenure
(预测变量之一)和名为Churn
的列(标签,字符串为'0'和'1')。
col1 col2 ... Tenure ... Churn
val_1 ... 5 0
val_i ... ... label_i
val_n ... 36 1
现在我想产生一个具有这些值的数据框:
Tenure Churned Churn_Rate
5 51 15.31
... ... ...
36 16 21.98
数据按
Tenure
分组,Churned
是值'1'的频率,而Churn_Rate
是每个Tenure
值出现的百分比。到目前为止,这是我所做的,但是我得到了一个元组。
churn_per_tenure = grs_df_main.groupby(['Tenure']).apply(lambda x: ((x['Churn'] == '1').sum(), x['Churn'].count()))
另外,如何按以下方式对此输出进行排序:
Tenure
,Churned
或Churn_Rate
? 最佳答案
采用:
grs_df_main = pd.DataFrame({'Tenure':[1,1,1,2,2,2,3],
'Churn': ['0','1','1','1','0','0','0']})
print(grs_df_main)
Tenure Churn
0 1 0
1 1 1
2 1 1
3 2 1
4 2 0
5 2 0
6 3 0
如果只需要
rate
列,则可以使用syntactig sugar-groupby
by boolean mask
与Series
grs_df_main['Tenure']
和汇总mean
:churn_per_tenure = ((grs_df_main['Churn'] == '1').groupby(grs_df_main['Tenure'])
.mean()
.reset_index(name='Churn_Rate'))
print (churn_per_tenure)
Tenure Churn_Rate
0 1 0.666667
1 2 0.333333
2 3 0.000000
对于所有列,将
agg
与lambda
函数一起使用:f = lambda x: (x == '1').sum()
f.__name__ = 'Churned'
churn_per_tenure = grs_df_main.groupby(['Tenure'])['Churn'].agg([f, 'count']).reset_index()
churn_per_tenure['Churn_Rate'] = churn_per_tenure['Churned'] / churn_per_tenure.pop('count')
print (churn_per_tenure)
Tenure Churned Churn_Rate
0 1 2 0.666667
1 2 1 0.333333
2 3 0 0.000000
如果还要在
count
列中删除pop
函数:churn_per_tenure['Churn_Rate'] = churn_per_tenure['Churned'] / churn_per_tenure['count']
print (churn_per_tenure)
Tenure Churned count Churn_Rate
0 1 2 3 0.666667
1 2 1 3 0.333333
2 3 0 1 0.000000
关于python - dataframe.groupby中的频率和百分比与排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51632491/