如何为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] })
需求是要添加两行:
- 第一行是各数值列的总计
- 第二行是各列总计占所有列总计之和的百分比(取整)
简化实现方法
直接用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 │ └────────────┴───────┴───────┴───────┴───────┘
为什么这个方法更好?
- 更符合Polars风格:全程用Polars的向量化表达式,不用手动处理列表、字典这些中间结构,代码更简洁
- 效率更高:避免了循环和多次数据框拼接/插入操作,Polars会自动做底层优化
- 可读性强:每一步的意图都很明确——构造总计行、计算总合、构造百分比行、合并数据,一眼就能看明白
你看,这样是不是比原来的方法清爽多了😉
备注:内容来源于stack exchange,提问作者Graham Palmer
相关产品推荐
相关产品推荐

