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

3
我的数据长这样:
...
                     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

...

在同一天的两个不同时间测量了A、B和C。

我需要将每两个测量/天合并为一行(例如,对于前两行):

  • 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

任何指针都将不胜感激。

现在我的问题是每天是否总是只有两个录音,还是可能只有一个。 - cs95
感谢您的耐心,@coldspeed!是的,每天只有2行,保持一致。 - pepe
2个回答

4

请检查

df.groupby(df.index.date).apply(lambda x : pd.Series({'A':sum(x['A']*x['B'])/sum(x['B']),'C':(x['C']).mean()}))
                   A      C
2017-09-18  1.000018  250.0
2017-09-19  1.000030  300.0

或者我们不使用apply。
t1=df.eval('A*B').groupby(df.index.date).sum()/df.groupby(df.index.date).B.sum()
t2=df.groupby(df.index.date).C.mean()

pd.concat([t1,t2],1)
                   0    C
2017-09-18  1.000018  250
2017-09-19  1.000030  300

4
您可以使用 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
  • 由于groupby计算使用了多个列“ A”和“ B”,因此我们需要为第一个条件使用apply
  • 对于计算“ 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接