gpt4 book ai didi

python - 如何切片 PandasGroupByObject 并在 agg 中使用多个函数

转载 作者:行者123 更新时间:2023-12-05 02:26:57 25 4
gpt4 key购买 nike

我有一个带有 DataGroup 的 pandas DataFrame,我想使用 agg 方法执行多个功能。

from scipy.stats import iqr, norm
import pandas as pd
df = pd.DataFrame({'Data':[1,2,3,5,10,5,3,3,4,1], 'Group':[1,2,2,1,1,1,2,2,2,1]})
df.groupby('Group')['Data'].agg(['median', iqr])

效果很好。但现在我想在执行操作之前对组进行切片。

问题是,

df.groupby('Group')['Data'].iloc[2:-2].agg(['median', iqr])

抛出错误,因为 PandasGroupByObjects 不支持切片。出现错误

df.groupby('Group')['Data'].nth[2:-2].agg(['median', iqr])

也是,因为不允许组合。

post显示 lambda 函数 可用于对值进行切片。

我试着用这个,但是

df.groupby('Group')['Data'].agg(lambda x: [np.median(x.iloc[2:-2]), iqr(x.iloc[2:-2])])

返回一个包含列表的 DataFrames,这不是我想要的。

如何应用切片并获得格式良好的 DataFrame 作为返回值?

想要的输出:

       median  iqr
Group
1 10.0 0.0
2 3.0 0.0

最佳答案

如果您要应用多个组或多个函数,一个选项是双 groupby:

(df.groupby('Group', as_index=False, group_keys=False)
.apply(lambda g: g.iloc[2:-2])
.groupby('Group')['Data']
.agg(['median', iqr])
)

效率将取决于函数和组的数量。

输出:

       median  iqr
Group
1 10.0 0.0
2 3.0 0.0

时间

groupby 的效率低于 named aggregation对于少数函数和少数组,但对于其中许多函数更有效,这是预期的,因为对双 groupby 执行切片 一次一样多在另一种情况下有组×聚合函数(尽管尺寸较小)。

提供的例子:

# double groupby
2.43 ms ± 554 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# lambdas with named aggregation
2.39 ms ± 867 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

10 万行,2 个组,2 个聚合:

# double groupby
12.1 ms ± 913 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# lambdas with named aggregation
8.12 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

10 万行,2 个组,100 个聚合:

# double groupby
149 ms ± 22.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# lambdas with named aggregation
300 ms ± 34.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

10 万行,52 个组,5 个聚合:

# double groupby
30.1 ms ± 4.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# lambdas with named aggregation
52.2 ms ± 10.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

10 万行,52 个组,100 个聚合:

# double groupby
220 ms ± 24.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# lambdas with named aggregation
837 ms ± 109 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 如何切片 PandasGroupByObject 并在 agg 中使用多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73499364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com