使用具有多个参数的自定义函数,并按列进行分区/分组

huangapple go评论65阅读模式
英文:

Using Custom Function with multiple parameters and partitioning/grouping by a column

问题

在Python Polars中,您可以像以下示例一样执行类似的操作:

import polars as pl
import statsmodels.api as sm

lowess = sm.nonparametric.lowess

df = pl.DataFrame({
    'x': ['a', 'a', 'a', 'b', 'b', 'b'],
    'y': [1, 2, 3, 1, 2, 3],
    'z': [0.2, 0.3, 0.5, 0.1, 0.3, 0.7]
})

result_df = df.groupby('x').agg(
    pl.col('z').agg(lambda col: pl.DataFrame(lowess(col, df['y'], frac=0.1)))
)

上述代码演示了如何按列"x"分组,然后应用具有多个参数的函数。最终,result_df将包含按"x"列分组后应用lowess函数的结果。

英文:

Is it possible to do something like the following in python polars:

import polars as pl
import statsmodels.api as sm
lowess = sm.nonparametric.lowess
df = pl.DataFrame([pl.Series('x', ['a', 'a', 'a', 'b','b', 'b']),
    pl.Series('y', [1, 2, 3, 1, 2, 3]),
    pl.Series('z', [.2, .3, .5, .1, .3, .7])]
)
df.with_columns([
    pl.struct(['z', 'y']).map(lambda cols: pl.DataFrame(lowess(cols['z'], cols['y'], frac = .1))).over('x')
])

I want to group by one or more columns and then apply a function with more than 1 argument.

答案1

得分: 1

使用窗口函数.over()时,应该使用.apply()函数。要访问struct的特定字段,您可以使用.struct.field()方法

def get_lowess(s: pl.Series) -> pl.Series:
    return pl.Series(
        lowess(s.struct.field("z"), s.struct.field("y"), frac=0.1)
    )

df.with_columns([
    pl.struct(['z', 'y']).apply(get_lowess).over('x').alias("lowess")
])
英文:

With window function .over() you should use .apply() function. To reach specific field of struct you can use .struct.field() method.

def get_lowess(s: pl.Series) -> pl.Series:
    return pl.Series(
        lowess(s.struct.field("z"), s.struct.field("y"), frac = .1)
    )

df.with_columns([
    pl.struct(['z', 'y']).apply(get_lowess).over('x').alias("lowess")
])

huangapple
  • 本文由 发表于 2023年2月7日 00:59:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/75364346.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定