Pandas统计列值出现频率并新增百分比占比列实现同表输出的方法
实现方法
你可以直接将两次统计得到的带相同多重索引的Series合并为同一个DataFrame,不需要分开计算两次groupby操作,代码如下:
# 先计算分组计数 count_ser = df_telco.groupby("PhoneService")["Churn"].value_counts() # 基于计数直接计算同分组占比,不需要二次分组统计 prop_ser = (count_ser / count_ser.groupby(level=0).transform('sum') * 100).round(2).astype(str) + ' %' # 合并两个序列为DataFrame,指定列名 res_df = pd.concat([count_ser, prop_ser], axis=1, keys=['count', 'proportion'])
如果你需要把PhoneService、Churn两个索引列转为普通列、取消合并单元格样式的展示,在代码最后加一句res_df = res_df.reset_index()即可。
另外也可以用crosstab接口一步完成统计,写法更简洁:
res_df = pd.crosstab( index=[df_telco['PhoneService'], df_telco['Churn']], columns='count' ).assign( proportion=lambda x: (x['count']/x.groupby(level=0)['count'].transform('sum')*100).round(2).astype(str)+' %' )
两种方法输出的结果都和你期望的表结构完全一致。
内容的提问来源于stack exchange,提问作者Ataul Morshed
相关产品推荐
相关产品推荐

