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


另外,如何按以下方式对此输出进行排序:TenureChurnedChurn_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 maskSeries 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


对于所有列,将agglambda函数一起使用:

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/

10-11 07:47