Python 如何在熊猫中每2行进行加权平均?

Python 如何在熊猫中每2行进行加权平均?,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据如下所示: ... 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      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

我需要每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
如有任何提示,我们将不胜感激。

请咨询

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

您可以使用
groupby
apply
mean
将其矢量化:

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

现在我的问题是每天是否总是只有两次录音,或者是否可能有1次。谢谢你的耐心@coldspeed!是的,每天只有2排,一直如此