如何用列表推导式生成Polars聚合函数并应用于DataFrame
问题:如何通过聚合函数列表批量生成Polars列?
假设我定义了一个聚合函数名称列表:
aggs=['sum','std','mean','min','max']
现有Polars DataFrame:
import polars as pl df=pl.DataFrame({'a':[1,2,3], 'b':[2,3,4]})
我想实现类似以下伪代码的效果(直接运行会报错):
df.with_columns([pl.col('a').x() for x in aggs])
要求:
- 支持为生成的列添加
.name.suffix()后缀 aggs不一定是字符串列表,也可以是其他形式
解决方案
有两种可行的实现方式,完全匹配你想要的列表推导式写法:
方式1:针对字符串类型的聚合函数列表
用Python内置的getattr()方法,动态获取Polars列对象对应的聚合方法,调用后再添加后缀:
import polars as pl aggs = ['sum', 'std', 'mean', 'min', 'max'] df = pl.DataFrame({'a':[1,2,3], 'b':[2,3,4]}) result = df.with_columns( [getattr(pl.col('a'), agg)().name.suffix(f'_{agg}') for agg in aggs] ) print(result)
运行后会生成a_sum、a_std、a_mean等列,每个列对应a列的聚合结果。
方式2:直接使用聚合函数对象列表
如果不想用字符串,直接把Polars的聚合函数放进列表更直观,利用函数的__name__属性生成后缀:
import polars as pl # 直接用Polars聚合函数对象构建列表 aggs = [pl.sum, pl.std, pl.mean, pl.min, pl.max] df = pl.DataFrame({'a':[1,2,3], 'b':[2,3,4]}) result = df.with_columns( [agg(pl.col('a')).name.suffix(f'_{agg.__name__}') for agg in aggs] ) print(result)
扩展:多列批量处理
如果要给DataFrame的所有列都应用这些聚合函数,只需要嵌套一层列表推导:
result = df.with_columns( [getattr(pl.col(col), agg)().name.suffix(f'_{agg}') for col in df.columns for agg in aggs] )
内容的提问来源于stack exchange,提问作者Dean MacGregor
相关产品推荐
相关产品推荐

