Pandas groupby - 我可以将它用于不同行集的不同功能吗?

Posted

技术标签:

【中文标题】Pandas groupby - 我可以将它用于不同行集的不同功能吗?【英文标题】:Pandas groupy - Can I use it for different functions on different sets of rows? 【发布时间】:2021-11-03 21:17:49 【问题描述】:

我有一个大型 pandas 数据框,其中包含许多不同类型的观察结果,需要对其应用不同的模型。一列是要应用的模型,并且可以映射到接受数据帧并返回数据帧的 python 函数。一种方法是只需执行 3 个步骤:

    将数据帧拆分为用于 n 个不同模型的 n 个数据帧 通过每个函数运行每个数据帧 在最后连接输出数据帧

这最终会变得不那么灵活,尤其是在添加和删除模型时。看着 groupby 似乎我应该能够利用它来使它在代码方面看起来更清晰,但我一直无法找到一个可以做我想要的模式。

另外,由于这些数据的大小,使用 apply 并不是特别有用,因为它会大大减慢运行时间。

快速示例:

df = pd.DataFrame("model":["a","b","a"],"a":[1,5,8],"b":[1,4,6])
def model_a(df):
    return df["a"] + df["b"]
def model_b(df):
    return df["a"] - df["b"]
model_map = "a":model_a,"b":model_b
results = df.groupby("model")...

预期结果将类似于 [2,1,14]。有没有一种简单的代码方式来做到这一点?请注意,实际模型要复杂得多,并且可能涉及数百个具有大量转换的变量,这只是一个玩具示例。

谢谢!

【问题讨论】:

【参考方案1】:

你可以使用groupby/apply:

x.name 包含组的名称,此处为 ab x 包含子数据框
df['r'] = df.groupby('model') \
            .apply(lambda x: model_map[x.name](x)) \
            .droplevel(level='model')
>>> df
  model  a  b   r
0     a  1  1   2
1     b  5  4   1
2     a  8  6  14

或者你可以使用np.select:

>>> np.select([df['model'] == 'a', df['model'] == 'b'],
              [model_a(df), model_b(df)])

array([ 2,  1, 14])

【讨论】:

这在运行时如何?它是利用矢量化还是逐行遍历数据帧?请注意我最初的问题中的评论:“同样由于这些数据的大小,使用 apply 并不是特别有用,因为它会大大减慢运行时间。” nvm 刚刚测试了这个效果很好并且矢量化了,谢谢!

以上是关于Pandas groupby - 我可以将它用于不同行集的不同功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别

用于 Excel 电子表格的 Pandas groupby

Pandas`agc`列表,“AttributeError / ValueError:函数不减少”

Pandas 按 groupby 求和,但不包括某些列

pandas groupby 可以聚合成一个列表,而不是 sum、mean 等吗?

pandas如何对value列数据进行分组groupby?