如何正确合并含百分比的DataFrame行?区域合并场景示例
合并区域后准确计算百分比的方法
你的问题核心是百分比不能直接取算术平均,因为每个区域的人口基数不同,必须用加权平均计算,权重就是各区域的人口数量。
示例数据
| 区域 | 人口数量 | 汽车拥有者占比(%) | 就业者占比(%) |
|---|---|---|---|
| A | 320 | 62.5 | 78.13 |
| B | 215 | 69.77 | 83.72 |
| C | 418 | 74.16 | 90.91 |
正确计算逻辑
合并B、C为D区域时,要先把百分比转换为实际人数,求和后再除以D区域的总人口,得到准确占比:
- 计算单区域实际人数:
实际人数 = 人口数量 × 百分比/100 - 合并区域后,汇总实际人数与总人口
- 最终占比 =
(汇总实际人数 / 汇总总人口) × 100
以汽车拥有者占比为例:
- B区域汽车拥有者人数:
215 × 69.77% ≈ 150 - C区域汽车拥有者人数:
418 × 74.16% ≈ 310 - D区域总人口:
215 + 418 = 633 - D区域汽车拥有者占比:
(150+310)/633 ×100 ≈ 72.67%
如果直接取B、C的百分比均值:(69.77+74.16)/2 ≈71.96%,和准确值有明显差异,这就是未考虑人口权重导致的误差。
Pandas实现代码
假设你的DataFrame名为df,按以下步骤操作:
- 定义区域合并映射:
region_mapping = { 'B': 'D', 'C': 'D', 'A': 'A' } df['新区域'] = df['区域'].map(region_mapping)
- 计算各区域实际人数列:
df['汽车拥有者人数'] = df['人口数量'] * df['汽车拥有者占比(%)'] / 100 df['就业者人数'] = df['人口数量'] * df['就业者占比(%)'] / 100
- 分组汇总并计算准确百分比:
result = df.groupby('新区域').agg( 总人口=('人口数量', 'sum'), 汽车拥有者总人数=('汽车拥有者人数', 'sum'), 就业者总人数=('就业者人数', 'sum') ).assign( 汽车拥有者占比(%)=lambda x: (x['汽车拥有者总人数'] / x['总人口']) * 100, 就业者占比(%)=lambda x: (x['就业者总人数'] / x['总人口']) * 100 ).round(2) # 保留两位小数
执行后result的最终结果:
| 新区域 | 总人口 | 汽车拥有者总人数 | 就业者总人数 | 汽车拥有者占比(%) | 就业者占比(%) |
|---|---|---|---|---|---|
| A | 320 | 200.00 | 250.02 | 62.50 | 78.13 |
| D | 633 | 460.00 | 543.00 | 72.67 | 85.78 |
补充建议
- 以后遇到带百分比的合并计算,都要先转换为实际基数(人数、金额等)再汇总,避免算术平均的误差。
- 如果有更多百分比列,可以用循环批量处理,不用手动逐个添加计算列。
内容的提问来源于stack exchange,提问作者Mimikable _
相关产品推荐
相关产品推荐

