Python 使用Groupby对象进行计算

Python 使用Groupby对象进行计算,python,pandas,Python,Pandas,我想检索两个groupby系列对象,并在它们之间进行计算 系列对象如下: Cost ID yy 312 13 102429.610000 361 15 170526.000000 373 14 400000.000000 403 13 165000.000000 14 165000.000000 15 183558.720000 16

我想检索两个groupby系列对象,并在它们之间进行计算

系列对象如下:

Cost
    ID    yy
    312   13    102429.610000
    361   15    170526.000000
    373   14    400000.000000
    403   13    165000.000000
          14    165000.000000
          15    183558.720000
          16    133763.760980
          17    121301.930160

Percentage
        ID    yy
        312   13     21.687500
        361   15     33.181818
        373   14     12.439024
        403   13     22.966667
              14     22.966667
              15     24.142857
              16     23.333333
              17     36.666667

cost=df.groupby(['ID', 'yy'])['cost']
percentage=df.groupby(['ID', 'yy'])['percentage']
我基本上想计算成本*百分比


如何正确地做到这一点?错误为“不支持*:“SeriesGroupBy”和“SeriesGroupBy”的操作数类型。

这是您需要的吗

pct.mul(cost)/100
Out[332]: 
ID   yy
312  13    22214.421669
361  15    56583.626963
373  14    49756.096000
403  13    37895.000550
     14    37895.000550
     15    44316.319281
     16    31211.543783
     17    44477.374796
Name: V, dtype: float64

这是你需要的吗

pct.mul(cost)/100
Out[332]: 
ID   yy
312  13    22214.421669
361  15    56583.626963
373  14    49756.096000
403  13    37895.000550
     14    37895.000550
     15    44316.319281
     16    31211.543783
     17    44477.374796
Name: V, dtype: float64

您使用的groupby没有任何作为groupby对象而不是序列返回的聚合函数

你需要

cost = df1.set_index(['ID', 'yy'])['cost']
pct = df2.set_index(['ID', 'yy'])['cost']
cost.mul(pct/100)

ID   yy
312  13    22214.421669
361  15    56583.626963
373  14    49756.096000
403  13    37895.000550
     14    37895.000550
     15    44316.319281
     16    31211.543783
     17    44477.374796

您使用的groupby没有任何作为groupby对象而不是序列返回的聚合函数

你需要

cost = df1.set_index(['ID', 'yy'])['cost']
pct = df2.set_index(['ID', 'yy'])['cost']
cost.mul(pct/100)

ID   yy
312  13    22214.421669
361  15    56583.626963
373  14    49756.096000
403  13    37895.000550
     14    37895.000550
     15    44316.319281
     16    31211.543783
     17    44477.374796

您可以直接将成本和百分比相乘,因为这里您的指数,即id和yy对于两个DF都是相同的。 所以


您可以直接将成本和百分比相乘,因为这里您的指数,即id和yy对于两个DF都是相同的。 所以


将来自相同(分组)df的两个系列视为两个不同的对象是错误的。所以,只要做:

with df.groupby(['ID', 'yy']) as dfg:
    dfg['cost'] * dfg['percentage'] # you have to assign or write the output
你甚至可以把它简化成一行,如果你把可复制的数据发布给我们,我会发布的。事实上,正如@Neo所显示的,类似于:

df.groupby(['ID', 'yy']).percentage.mul(cost)

将来自相同(分组)df的两个系列视为两个不同的对象是错误的。所以,只要做:

with df.groupby(['ID', 'yy']) as dfg:
    dfg['cost'] * dfg['percentage'] # you have to assign or write the output
你甚至可以把它简化成一行,如果你把可复制的数据发布给我们,我会发布的。事实上,正如@Neo所显示的,类似于:

df.groupby(['ID', 'yy']).percentage.mul(cost)

不,这两个系列都来自同一个df。因此,您只需执行
df.groupby(['ID',yy'])
@smci,这里的成本和百分比是问题中指定的两个不同的数据帧不,它们都来自相同的分组df:
df.groupby(['ID',yy'])
。不,这两个系列都来自相同的df。所以你只需要做
df.groupby(['ID',yy'])
@smci,这里的成本和百分比是问题中指定的两个不同的数据帧不,它们都来自同一个分组df:
df.groupby(['ID',yy'])
。你把来自同一(分组)df的两个系列视为两个不同的对象,这让事情变得更难了。而是执行
df.groupby(['ID','yy'])
并保存分组的df(或将其与上下文管理器一起使用)。看到我的回答了吗?你把来自同一个(分组)df的两个系列视为两个不同的对象,这让事情变得更难了。而是执行
df.groupby(['ID','yy'])
并保存分组的df(或将其与上下文管理器一起使用)。看到我的答案了吗