如何在Pandas中基于另一列的NaN重置值后重新加权列?
简洁实现Pandas权重调整需求
针对你给出的DataFrame,我们可以通过布尔索引结合向量化操作,更简洁高效地完成权重调整:将Type为np.nan的行的wgt设为0,同时让其余行的权重按比例缩放,保持总权重和原数值一致。
核心代码实现
import pandas as pd import numpy as np df = pd.DataFrame({'Type': ['A', np.nan, 'B', 'C', 'D', np.nan], 'wgt': [0.1, 0.2, 0.3, 0.25, 0.1, 0.05]}) # 计算原总权重 total_weight = df['wgt'].sum() # 筛选Type非空的有效行 valid_mask = df['Type'].notna() # 计算有效权重的总和 valid_total = df.loc[valid_mask, 'wgt'].sum() # 生成新权重:有效行按比例缩放,空值行设为0 df['new_wgt'] = df['wgt'].where(~valid_mask, df['wgt'] * (total_weight / valid_total))
结果验证
运行后df['new_wgt']的结果为:
0 0.133333 1 0.000000 2 0.400000 3 0.333333 4 0.133333 5 0.000000 Name: new_wgt, dtype: float64
完全符合你的预期。
优势说明
- 高效性:利用Pandas的向量化方法(
where、布尔索引),避免循环或逐行操作,处理大数据集时性能更优 - 简洁性:逻辑集中,仅需几行代码完成全部操作,可读性强
- 可维护性:变量命名清晰,后续修改需求时更容易调整
内容的提问来源于stack exchange,提问作者mcragosta
相关产品推荐
相关产品推荐

