使用 pandas/dataframe 基于 2 列计算加权平均值

Posted

技术标签:

【中文标题】使用 pandas/dataframe 基于 2 列计算加权平均值【英文标题】:Calculate weighted average based on 2 columns using a pandas/dataframe 【发布时间】:2019-08-29 21:28:45 【问题描述】:

我有以下数据框 df。我想计算按每个日期和部门级别分组的加权平均值

 date     Equity    value    Sector   Weight
2000-01-31  TLRA    20      RG Index     0.20
2000-02-28  TLRA    30      RG Index     0.20
2000-03-31  TLRA    40      RG Index     0.20
2000-01-31   RA     50      RG Index     0.30
2000-02-28   RA     60      RG Index     0.30
2000-03-31   RA     70      RG Index     0.30
2000-01-31  AAPL    80      SA Index     0.50
2000-02-28  AAPL    90      SA Index     0.50
2000-03-31  AAPL    100     SA Index     0.50
2000-01-31  SPL     110     SA Index     0.60
2000-02-28  SPL     120     SA Index     0.60
2000-03-31  SPL     130     SA Index     0.60

Sector 下可以有多个 Equity。我想要基于权重列的部门级别加权平均值。

预期输出:

date        RG Index       SA Index
2000-01-31  19               106  
2000-02-28  24               117
2000-03-31  29               138 

我尝试了下面的代码,但没有得到预期的输出。请帮忙

g = df.groupby('Sector')
df['wa'] = df.value / g.value.transform("sum") * df.Weight
df.pivot(index='Sector', values='wa')

【问题讨论】:

每组中您的体重总和!= 1。所以不太确定你的输出真的是平均值。您是否想将它们重新归一化以求和为 1,这是 np.average 之类的默认行为 【参考方案1】:

更像pivot 问题第一assign 一个新列作为valueweight 的产物

df.assign(V=df.value*df.Weight).pivot_table(index='date',columns='Sector',values='V',aggfunc='sum')
Out[328]: 
Sector      RGIndex  SAIndex
date                        
2000-01-31     19.0    106.0
2000-02-28     24.0    117.0
2000-03-31     29.0    128.0

【讨论】:

以上是关于使用 pandas/dataframe 基于 2 列计算加权平均值的主要内容,如果未能解决你的问题,请参考以下文章

pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )

pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )

Pandas。滚动指定时间窗口和win_type

pyspark dataframe数据连接(join)转化为pandas dataframe基于多个字段删除冗余数据

004.pandas.DataFrame

004.pandas.DataFrame