使用 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
一个新列作为value
和weight
的产物
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 )