gpt4 book ai didi

python - 如何在 Pandas 中每 2 行执行加权平均?

转载 作者:太空宇宙 更新时间:2023-11-03 12:53:06 24 4
gpt4 key购买 nike

我的数据是这样的:

...
A B C
2017-09-18 12:00:00 1.000010 18000 100
2017-09-18 17:00:00 1.000029 13500 400
2017-09-19 12:00:00 1.000025 18000 300
2017-09-19 17:00:00 1.000037 13500 300

...

在同一天的 2 个不同时间采取措施 A、B 和 C。

我需要将每 2 个小节/天折叠成一行(例如,对于前 2 行):

  • A 列和 B 列的加权平均值

    ((A1 * B1) + (A2 * B2))/(B1 + B2)

  • C 列的平均值

    (C1 + C2)/2

我的困难在于尝试 df.groupby 这些相邻的行,因为它们有不同的时间并且需要对列 A B 执行自定义操作,这与 C 不同。

我的预期输出是:

                     A            C
2017-09-18 12:00:00 1.000018143 250
2017-09-19 12:00:00 1.000030143 300

如有任何指点,我们将不胜感激。

最佳答案

您可以使用 groupbyapplymean 对其进行矢量化:

def AB_weighted(g):
return (g['A'] * g['B']).sum() / g['B'].sum()

g = df.groupby(df.index.date)
pd.concat([g.apply(AB_weighted), g['C'].mean()], keys=['A', 'C'], axis=1)

A C
2017-09-18 1.000018 250
2017-09-19 1.000030 300
  • 我们需要为第一个条件apply,因为 groupby 计算使用多个列——“A”和“B”。
  • 为了计算“C”的平均值,只需要“C”,所以我们可以使用 mean() 来缩短。

另一种选择是在 groupby 之前计算乘积,因此我们可以绕过对 apply 的调用(这有点像@W-B 第二个答案)但是有一个 sum 调用。

u = df.assign(D=df['A'] * df['B'])[['D', 'B']].groupby(df.index.date).sum()
u['A'] = u.pop('D') / u.pop('B')

u['C'] = df.groupby(df.index.date)['C'].mean()

u
A C
2017-09-18 1.000018 250
2017-09-19 1.000030 300

关于python - 如何在 Pandas 中每 2 行执行加权平均?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271441/

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