如何高效聚合两个DataFrame的国家权重,计算组合地理配置?
问题描述
我有一个名为a的DataFrame,以isin列为索引,存储基金的地理权重:
U.S. Canada U.K. isin LU1739554647 0.08 0.210 0.11 LU0599946893 0.14 0.026 0.07 LU1460782227 0.25 0.050 0.14
另有一个名为b的DataFrame,存储非基金类工具数据,包含asset_ID(工具isin码)、country(国家代码)和weight(权重)列:
asset_ID country weight 0 US1912161007 U.S. 0.005 1 GB0007188757 U.K. 0.100
目标是聚合并求和两个DataFrame的国家权重,计算整个投资组合的地理配置。已通过a.sum(axis = 0, skipna = True)得到a的列求和结果:
U.S. 0.470 Canada 0.286 U.K. 0.320
需要将该结果与b的权重聚合求和,期望得到如下结果:
U.S. 0.475 Canada 0.286 U.K. 0.420
注:a的列数(国家数量)不固定,isin码和国家代码均唯一。
高效实现方法
可以利用Pandas的内置分组与向量化运算来高效完成,步骤如下:
对
b按国家分组求和:
将b中的权重按country列分组并求和,得到非基金类工具的各国家权重总和:b_country_sum = b.groupby('country')['weight'].sum()执行后得到:
country U.S. 0.005 U.K. 0.100 Name: weight, dtype: float64合并两个权重结果并求和:
利用Pandas的add方法,将a的列求和结果与b的分组求和结果按国家索引对齐相加,对缺失的国家(如Canada)自动填充0,确保所有国家的权重都能被正确计算:a_sum = a.sum(axis=0, skipna=True) total_portfolio = a_sum.add(b_country_sum, fill_value=0)查看最终结果:
输出total_portfolio即可得到期望的投资组合地理配置:U.S. 0.475 Canada 0.286 U.K. 0.420 dtype: float64
效率说明
这种方法完全基于Pandas的向量化操作,避免了手动循环,处理速度远快于逐行计算;同时自动处理索引对齐,无需提前匹配国家列表,适配a列数不固定的场景。
内容的提问来源于stack exchange,提问作者Ig_Ferr
相关产品推荐
相关产品推荐

