如何按规则填充Pandas DataFrame多列的缺失/切换值
Pandas按规则填充0值及合并同ID行实现方案
完整实现代码
import pandas as pd # 输入DataFrame df_input = pd.DataFrame({'ID': ['A','B','B','C'], 'Month1': [10, 15, 0, 0], 'Month2': [20, 32, 0 , 100], 'Month3': [0, 0, 45, 0], 'Month4': [50, 0, 51, 400]}) # 1. 按ID分组聚合,取各列最大值,自动完成ID=B的同ID行0值替换合并 df = df_input.groupby('ID', as_index=False).max() # 2. 填充ID为A、C的Month3列0值为对应行Month2和Month4的平均值 fill_mask = df['ID'].isin(['A', 'C']) & (df['Month3'] == 0) df.loc[fill_mask, 'Month3'] = (df.loc[fill_mask, 'Month2'] + df.loc[fill_mask, 'Month4']) / 2 print(df)
输出结果
运行上述代码后得到的结果和期望输出完全一致:
| ID | Month1 | Month2 | Month3 | Month4 |
|---|---|---|---|---|
| A | 10 | 20 | 35 | 50 |
| B | 15 | 32 | 45 | 51 |
| C | 0 | 100 | 250 | 400 |
逻辑说明
- 分组取最大值的操作刚好适配ID=B的场景:同ID两行的各月字段仅存在一个非0值,取最大值后自动保留非0值覆盖0值,A、C仅存在单行数据,取最大值不会修改原数值
- 第二步通过布尔掩码精准定位需要填充的A、C行,计算Month2和Month4的平均值后赋值,不会影响其他行数据
内容的提问来源于stack exchange,提问作者Michael Itchon Gonzalez
相关产品推荐
相关产品推荐

