求和与分组

SBa*_*Bad 5 python group-by sum python-3.x pandas

我有一个如下所示的数据框:

全部控股基金

      BrokerBestRate  notional_current  DistanceBestRate
0           CITI          7.859426e+05          0.023194
1           WFPBS         3.609674e+06         -0.023041
2           WFPBS         1.488828e+06         -0.023041
3           JPM           3.484168e+05         -0.106632
4           CITI          6.088499e+05          0.023194
5           WFPBS         8.665558e+06         -0.023041
6           WFPBS         4.219563e+05         -0.023041
Run Code Online (Sandbox Code Playgroud)

我正在尝试一次进行求和积和分组(不创建额外的求和积列)

我试过这行代码

allHoldingsFund.groupby(['BrokerBestRate'])['notional_current']*['DistanceBestRate'].sum() 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做一个求和积,然后使用 group by 聚合它?

所需输出

BrokerBestRate      product of (notional_current  and DistanceBestRate)
   CITI              654654645665466
   JPM               453454534545367
  WFPBS              345345345345435
Run Code Online (Sandbox Code Playgroud)

非常感谢

WeN*_*Ben 7

您可以在之前构建产品列groupby

df.assign(col=df.notional_current*df.DistanceBestRate).groupby('BrokerBestRate',as_index=False).col.sum()
Out[372]: 
  BrokerBestRate            col
0           CITI   32350.817245
1            JPM  -37152.380218
2          WFPBS -326860.001568
Run Code Online (Sandbox Code Playgroud)


DSM*_*DSM 7

最简单但通常最慢的方法是使用apply

In [43]: df.groupby("BrokerBestRate").apply(lambda x: x.prod(axis=1).sum())
Out[43]: 
BrokerBestRate
CITI      32350.817245
JPM      -37152.380218
WFPBS   -326860.001568
dtype: float64
Run Code Online (Sandbox Code Playgroud)

但您也可以先计算产品列,然后对其调用 groupby :

In [44]: df.eval("notional_current * DistanceBestRate").groupby(df.BrokerBestRate).sum()
Out[44]: 
BrokerBestRate
CITI      32350.817245
JPM      -37152.380218
WFPBS   -326860.001568
dtype: float64

In [45]: df[["notional_current", "DistanceBestRate"]].prod(axis=1).groupby(df["BrokerBestRate"]).sum()
Out[45]: 
BrokerBestRate
CITI      32350.817245
JPM      -37152.380218
WFPBS   -326860.001568
dtype: float64
Run Code Online (Sandbox Code Playgroud)