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

如何在Pandas中正确生成带百分号的百分比列

Pandas生成带百分号占比列的问题解决

问题描述

现有如下Pandas DataFrame:

category  numbers
a         100
b         200
c         200

尝试新增带百分号的占比列时,使用了以下代码:

df['percentage'] = str(100 * df['numbers']/df['numbers'].sum()) + '%'

但执行后每一行的percentage列都显示完整的Series信息,结果不符合预期:

category  numbers  percentage
a         100      0 20.00 1 40.00 2 40.00 Name: numbers, dtype: float64%
b         200      0 20.00 1 40.00 2 40.00 Name: numbers, dtype: float64%
c         200      0 20.00 1 40.00 2 40.00 Name: numbers, dtype: float64%

需要修改代码让percentage列正确显示为20%、40%、40%。

错误原因

直接对整个Pandas Series调用str(),会将整个Series对象转换成字符串,而非逐元素处理,导致每一行都重复显示整个Series的内容。

解决方法

方法1:用apply逐元素格式化

先计算数值总和,再通过apply对每个元素计算占比并格式化为带百分号的字符串:

total = df['numbers'].sum()
df['percentage'] = df['numbers'].apply(lambda x: f"{100 * x / total:.0f}%")
  • .0f表示保留0位小数,若需保留两位小数可改为.2f。

方法2:直接对数值Series应用格式化字符串

total = df['numbers'].sum()
df['percentage'] = (100 * df['numbers'] / total).apply("{:.0f}%".format)

此方法与方法1原理一致,写法更简洁。

方法3:矢量操作(大数据集更高效)

使用numpy的矢量操作替代apply,适合处理大规模数据:

import numpy as np
total = df['numbers'].sum()
df['percentage'] = np.char.add((100 * df['numbers'] / total).round(0).astype(str), '%')

先计算占比并取整,转为字符串后拼接百分号,避免逐元素循环。

最终效果

执行任意一种方法后,DataFrame将变为:

category  numbers percentage
a         100     20%
b         200     40%
c         200     40%

内容的提问来源于stack exchange,提问作者Cookfishbro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:05:44