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

如何为Polars数据框的每个数值列添加总计行与占比行?

如何为Polars数据框的每个数值列添加总计行与占比行?

嘿,我来帮你简化这个操作!你原来的方法确实有点绕,其实用Polars的表达式API可以写出清爽得多的代码,完全不用拆拆拼拼、手动循环这些繁琐操作~

先回顾下你的初始数据和需求:
我们有这样一个Polars数据框:

import polars as pl

df = pl.DataFrame({
    "Col Ind": ['A','B','C','D','E'],
    "Col A": [1,2,3,4,5],
    "Col B": [2,4,6,8,10],
    "Col C": [1,3,5,7,9],
    "Col D": [5,4,3,2,1]
})

需求是要添加两行:

  1. 第一行是各数值列的总计
  2. 第二行是各列总计占所有列总计之和的百分比(取整)

简化实现方法

直接用Polars的表达式构造需要的两行,再和原数据合并就行,全程向量化操作,效率更高也更易读:

# 第一步:自动筛选出所有数值列(排除标识列"Col Ind")
num_cols = pl.all().exclude("Col Ind")

# 构造总计行:标识列设为"Total",数值列取各列总和
total_row = df.select(
    pl.lit("Total").alias("Col Ind"),
    num_cols.sum()
)

# 计算所有数值列总和的总和,用来算百分比
total_sum = df.select(num_cols.sum().sum()).item()

# 构造百分比行:标识列设为"Percentage",数值列计算占比后转整数
pct_row = df.select(
    pl.lit("Percentage").alias("Col Ind"),
    (num_cols.sum() / total_sum * 100).cast(pl.Int64)
)

# 合并原数据、总计行、百分比行
result_df = pl.concat([df, total_row, pct_row])

运行后就能得到你想要的结果:

┌────────────┬───────┬───────┬───────┬───────┐
│ Col Ind    ┆ Col A ┆ Col B ┆ Col C ┆ Col D │
│ ---        ┆ ---   ┆ ---   ┆ ---   ┆ ---   │
│ str        ┆ i64   ┆ i64   ┆ i64   ┆ i64   │
╞════════════╪═══════╪═══════╪═══════╪═══════╡
│ A          ┆ 1     ┆ 2     ┆ 1     ┆ 5     │
│ B          ┆ 2     ┆ 4     ┆ 3     ┆ 4     │
│ C          ┆ 3     ┆ 6     ┆ 5     ┆ 3     │
│ D          ┆ 4     ┆ 8     ┆ 7     ┆ 2     │
│ E          ┆ 5     ┆ 10    ┆ 9     ┆ 1     │
│ Total      ┆ 15    ┆ 30    ┆ 25    ┆ 15    │
│ Percentage ┆ 17    ┆ 35    ┆ 29    ┆ 17    │
└────────────┴───────┴───────┴───────┴───────┘

为什么这个方法更好?

  1. 更符合Polars风格:全程用Polars的向量化表达式,不用手动处理列表、字典这些中间结构,代码更简洁
  2. 效率更高:避免了循环和多次数据框拼接/插入操作,Polars会自动做底层优化
  3. 可读性强:每一步的意图都很明确——构造总计行、计算总合、构造百分比行、合并数据,一眼就能看明白

你看,这样是不是比原来的方法清爽多了😉

备注:内容来源于stack exchange,提问作者Graham Palmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:58:13