如何在python极地做嵌套聚合?请翻译一下西班牙语



我正在从熊猫过渡,所以请原谅我的非并行大脑。假设我们有如下的pandas代码:

dfx = pd.DataFrame({val:np.random.randint(1,5,100) for val in ['a','b','c','d','x','y','z']})
(
dfx
.groupby('a')
.apply(
lambda df:
df
.sort_values('c')
.groupby('d')
[['x','y','z']]
.agg(['max','mean','median'])
)
)

输出(用平滑的多索引粘贴在这里):

<表类>d012345678tbody><<tr>xxxyyyzzz和是中值和是中值和是中值1115.03.754.012.03.03.512.03.03.0129.03.03.05.01.6666671.09.03.04.01333.03.03.030.02.7272733.027.02.4545452.01423.02.87503.016.02.02.015.01.87501.02118.02.5714292.013.01.8571432.018.02.5714293.02218.02.01.023.02.5555562.025.02.7777783.02311.03.6666674.09.03.03.09.03.04.0243.01.501.506.03.03.04.02.02.03128.02.803.021.02.102.029.02.903.03213.02.1666672.019.03.1666673.018.03.03.03316.01.7777782.022.02.4444443.032.03.5555564.03420.02.2222222.023.02.5555562.023.02.5555563.0419.02.2502.010.02.502.505.01.2501.04219.03.1666673.08.01.3333331.022.03.6666674.04310.02.01.014.02.803.015.03.03.0449.02.2502.012.03.03.010.02.502.50

从你问题的后半部分开始,我认为polar处理子数据框架的方法是使用over来窗口:

dfplx = pl.DataFrame(dfx)
dfplx.select([
'a', 'b',
pl.col(["x", "y", "z"]).sort_by('c').over(['a', 'd']),
pl.col("x").sort_by('c').mean().over(['a', 'd'].alias("x mean")
])

如果你想在windows中使用apply,这是完全可能的(.list()使polar期望从lambda得到多个结果):

dfplx.select([
'a', 'b', 'c', 
pl.col(['x', 'y', 'z'])
.sort_by('c')
.apply(lambda x: [x.mean(), x.median(), x.max()])
.list()
.over(['a', 'd'])
])

对于完整的翻译,我发现最简洁的方法是简单地生成您想要的列列表:

dfplx.select(['a', 'b'] + 
[pl.col(a)
.sort_by('c') # sort for some reason ;)
.apply(func) # apply the [max, mean, median] function
.over(['a', 'd']) # window by a then d
.alias(f"{a} {label}")  # rename the result
for a in ['x', 'y', 'z']
for label, func in [("max", pl.max), ("mean", pl.mean), ("median", pl.median)]
])

最新更新