Pandas:如何高效仅对指定ID的Value列应用权重计算
高效实现指定ID的Value权重分配
嘿,我太懂你处理大型DataFrame时循环拖慢速度的痛苦了——Python层面的逐ID循环在数据量上去后真的会卡死,咱们用pandas的向量化操作来彻底解决这个问题,效率能提升好几个量级!
核心思路
利用groupby结合transform方法,一次性算出每个ID对应的Weight总和(这个操作是pandas底层优化过的,比手写循环快得多),再通过掩码精准定位列表L中的ID行,批量完成Value的权重分配,完全绕开低效的Python循环。
实现代码
import pandas as pd # 初始化你的DataFrame和目标ID列表 df = pd.DataFrame({'Id':['A','A','A','B','C','C','D','D'], 'Weight':[50,20,30,1,2,8,3,2], 'Value':[100,100,100,10,20,20,30,30]}) L = ['A','C'] # 计算每个Id对应的Weight总和,transform保证结果和原DataFrame行数一致 id_weight_total = df.groupby('Id')['Weight'].transform('sum') # 用掩码筛选出需要处理的行,批量更新Value列 target_mask = df['Id'].isin(L) df.loc[target_mask, 'Value'] = df.loc[target_mask, 'Value'] * df.loc[target_mask, 'Weight'] / id_weight_total[target_mask]
输出结果
运行后就能得到你想要的结果:
| Id | Weight | Value | |
|---|---|---|---|
| 0 | A | 50 | 50 |
| 1 | A | 20 | 20 |
| 2 | A | 30 | 30 |
| 3 | B | 1 | 10 |
| 4 | C | 2 | 4 |
| 5 | C | 8 | 16 |
| 6 | D | 3 | 30 |
| 7 | D | 2 | 30 |
为什么这个方法更快?
groupby.transform是基于C语言实现的向量化操作,彻底避免了Python循环的性能开销;- 一次性完成所有ID的Weight总和计算,再通过掩码批量更新目标行,减少了多次重复切片DataFrame的冗余操作,处理百万级数据时优势特别明显。
内容的提问来源于stack exchange,提问作者Ewdlam
相关产品推荐
相关产品推荐

