如何将多列值计数百分比转换为指定结构的Pandas DataFrame
问题:将Pandas列值占比整理为指定格式DataFrame
数据集
Name Batch DXYR Emp Lateral GDX MMT CN Joe 2 0 2 2 2 2 0 Alan 0 1 1 2 2 0 0 Josh 1 1 2 1 1 1 2 Max 0 1 0 0 0 0 2
需求:计算DataFrame中每列(仅包含0、1、2)各值的占比百分比,并整理为如下格式的DataFrame:
Batch DXYR Emp Lateral GDX MMT CN Count_0_percent 98.32 52.5 22 54.5 44.2 53.4 76.01 Count_1_percent 0.44 34.5 43 43.5 44.5 46.5 22.44 Count_2_percent 1.3 64.3 44 2.87 12.6 1.88 2.567
原代码及输出:
原循环代码:
for i in df.columns: (df[i].value_counts()/df[i].count())*100
输出为各列单独的Series:
0 90.608831 1 0.391169 2 9.6787899 Name: Batch, dtype: float64 0 95.545455 1 2.235422 2 2.6243553 Name: MX, dtype: float64 ...
解决方案
不需要循环,直接用Pandas的apply方法结合value_counts,再通过转置和索引重命名实现目标格式:
完整代码
import pandas as pd # 构造示例数据 data = { 'Name': ['Joe', 'Alan', 'Josh', 'Max'], 'Batch': [2, 0, 1, 0], 'DXYR': [0, 1, 1, 1], 'Emp': [2, 1, 2, 0], 'Lateral': [2, 2, 1, 0], 'GDX': [2, 2, 1, 0], 'MMT': [2, 0, 1, 0], 'CN': [0, 0, 2, 2] } df = pd.DataFrame(data) # 排除非数值列(比如Name),只处理目标列 target_cols = df.columns.drop('Name') # 计算每列各值的占比百分比,转置后重命名索引 result = df[target_cols].apply(lambda x: (x.value_counts(normalize=True) * 100)).T result.index = [f'Count_{v}_percent' for v in result.index] # 可选:保留指定小数位数,比如2位 result = result.round(2) print(result)
代码说明
- 筛选目标列:先排除
Name这类非数值列,只处理需要计算占比的列; - 批量计算占比:用
apply对每列执行value_counts(normalize=True),直接得到占比,再乘以100转为百分比; - 转置与重命名:通过
.T转置结果,让原列名变为新DataFrame的列,原值(0、1、2)变为行索引,再将索引重命名为Count_0_percent这类格式; - 小数位数处理:用
round()方法统一保留小数位数,让结果更整洁。
示例输出
运行上述代码后,会得到如下格式的结果:
Batch DXYR Emp Lateral GDX MMT CN Count_0_percent 50.0 25.0 25.0 25.0 25.0 50.0 50.0 Count_1_percent 25.0 75.0 25.0 25.0 25.0 25.0 0.0 Count_2_percent 25.0 0.0 50.0 50.0 50.0 25.0 50.0
内容的提问来源于stack exchange,提问作者Patrik
相关产品推荐
相关产品推荐

