英文:
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")
])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论