You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用更简洁易读的Polars语法实现group_by后接describe并返回单一DataFrame?

如何用更简洁易读的Polars语法实现group_by后接describe并返回单一DataFrame?

完全懂你的困扰!从Pandas转Polars的时候,确实会觉得有些操作的语法落差有点大——就像你说的,Pandas一行pd_df.groupby('group').value.describe()就能搞定的事,Polars一开始写起来居然要那么多代码,太不友好了😅

下面给你几种更简洁易读的写法,帮你实现同样的效果:

写法一:简化原有的map_groups逻辑

我们可以把你原来的代码精简一下,去掉冗余的括号,用更安全的first()方法获取分组标识,整体清爽很多:

pl_df.group_by('group').map_groups(
    lambda g: g['value'].describe().with_columns(group=g['group'].first())
).pivot(index='group', on='statistic', values='value')

写法二:用agg+展开的方式(更符合Polars风格)

这种写法不用lambda,而是通过聚合、展开、透视的组合来实现,逻辑更连贯:

(
    pl_df
    .group_by('group')
    .agg(pl.col('value').describe().alias('stats'))
    .explode('stats')
    .unnest('stats')
    .pivot(index='group', on='statistic', values='value')
)

写法三:直接指定统计量(性能最优)

如果你不需要describe()返回的全部统计量,或者追求更好的性能,可以直接在agg里列出需要的统计指标——这种方式是向量化操作,比逐组处理的map_groups效率更高:

(
    pl_df
    .group_by('group')
    .agg(
        pl.col('value').count().alias('count'),
        pl.col('value').mean().alias('mean'),
        pl.col('value').std().alias('std'),
        pl.col('value').min().alias('min'),
        pl.col('value').quantile(0.25).alias('25%'),
        pl.col('value').median().alias('50%'),
        pl.col('value').quantile(0.75).alias('75%'),
        pl.col('value').max().alias('max')
    )
)

目前Polars还没有像Pandas那样直接groupby.describe()的极简语法,但上面这些写法已经比你原来的实现简洁不少,而且可读性也更强。如果是追求和Pandas输出完全一致的结果,前两种写法都能满足需求;如果看重性能,第三种写法会更合适。

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

火山引擎 最新活动