基于非数值数据的Pandas透视表构建及百分比转换求助
没问题,我来帮你实现这个需求!咱们一步步来:
1. 先构造示例DataFrame(方便你复现测试)
首先把你给出的原始数据转换成可运行的Pandas代码:
import pandas as pd df = pd.DataFrame({ 'TARGET': [0, 1, 0, 1], 'FLAG_OWN_CAR': ['Y', 'N', 'Y', 'Y'], 'FLAG_OWN_REALTY': ['N', 'N', 'Y', 'Y'] })
2. 生成目标频数统计表
我们可以通过分别对两个FLAG列做交叉统计,再用pd.concat合并并添加层级列名的方式实现:
# 分别统计每个FLAG列与TARGET的交叉计数 car_counts = pd.crosstab(df['TARGET'], df['FLAG_OWN_CAR']) realty_counts = pd.crosstab(df['TARGET'], df['FLAG_OWN_REALTY']) # 合并两个结果,设置上层列名 count_table = pd.concat( [car_counts, realty_counts], axis=1, keys=['FLAG_OWN_CAR', 'FLAG_OWN_REALTY'] ) print(count_table)
运行后输出的结果完全符合你的要求:
FLAG_OWN_CAR FLAG_OWN_REALTY TARGET Y N Y N 0 2 0 1 1 1 1 1 1 1
3. 生成百分比形式的统计表
从你的示例来看,百分比是基于总样本数计算的(总共有4条数据),我们只需要在频数表的基础上做简单转换即可:
# 计算总样本数 total_samples = len(df) # 转换为百分比并添加%符号 percent_table = (count_table / total_samples * 100).astype(str) + '%' print(percent_table)
运行后得到你想要的百分比结果:
FLAG_OWN_CAR FLAG_OWN_REALTY TARGET Y N Y N 0 50% 0% 25% 25% 1 25% 25% 25% 25%
如果之后你需要的是行内占比(比如每行的总和为100%),只需要把代码改成:
percent_table_row = (count_table.div(count_table.sum(axis=1), axis=0) * 100).astype(str) + '%'
内容的提问来源于stack exchange,提问作者Kamila Ambro
相关产品推荐
相关产品推荐

