如何在Pandas中计算每行数据占该行总计的百分比?
在Pandas中计算每行数据占该行总计的百分比
针对你的需求,这里有两种高效的实现方式,尤其适合处理包含数百列的DataFrame:
方法一:手动指定非日期列
先构造示例数据:
import pandas as pd df = pd.DataFrame({ 'date': ['2020-01-01', '2020-02-01'], 'A': [10, 20], 'B': [40, 60], 'C': [50, 100] })
然后执行计算:
# 排除date列,选择所有数据列 data_cols = df.columns.drop('date') # 计算每行的总和 row_sums = df[data_cols].sum(axis=1) # 计算每行各列占比,保留两位小数 df[data_cols] = df[data_cols].div(row_sums, axis=0).round(2)
执行后得到结果:
date A B C 0 2020-01-01 0.10 0.40 0.50 1 2020-02-01 0.11 0.33 0.56
注:示例中C列的0.55是对100/180≈0.555...的近似,使用round(2)会得到0.56,若需要和示例完全一致,可以调整精度或直接保留更多小数后截断。
方法二:自动识别数值列(更适合数百列场景)
如果你的DataFrame里除了date还有其他非数值列,或者不想手动罗列数据列,可以自动筛选数值列:
# 自动选择所有数值类型的列 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns row_sums = df[numeric_cols].sum(axis=1) df[numeric_cols] = df[numeric_cols].div(row_sums, axis=0).round(2)
这种方式无需手动指定列名,能自动适配任意数量的数值列,非常适合你的数百列场景。
关键说明
- 使用
div(row_sums, axis=0)实现按行除法,Pandas的向量化操作比循环遍历高效得多,处理大数据集速度更快 - 如果不需要保留原始数据,可以直接在原DataFrame上修改,无需创建副本
- 可以根据需求调整
round()的参数来控制小数位数,或者去掉round()保留完整精度
内容的提问来源于stack exchange,提问作者titu84hh
相关产品推荐
相关产品推荐

