You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于非数值数据的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:47