如何用Pandas高效通过映射另一列填充DataFrame列缺失值?
Pandas按Month列填充Year缺失值的最优方法
首先构造示例DataFrame用于测试:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Year': [2021, 2021, 2021, 2022, 2022, 2022, np.nan], 'Month': [10, 11, 12, 1, 2, 3, 1] })
方法一:np.where简洁实现
适合仅需区分两类Month的场景,代码直观且高效:
df['Year'] = df['Year'].fillna(np.where(df['Month'].isin([1,2,3]), 2022, 2021))
逻辑:判断Month是否属于1/2/3,是则填充2022,否则填充2021,再通过fillna替换Year列的缺失值。
方法二:字典映射+fillna
扩展性更强,若后续新增Month与Year的对应关系,仅需修改字典即可:
month_year_map = {1:2022, 2:2022, 3:2022, 10:2021, 11:2021, 12:2021} df['Year'] = df['Year'].fillna(df['Month'].map(month_year_map))
逻辑:通过字典定义每个Month对应的Year,用map匹配后填充Year的缺失值。
方法三:loc索引直接赋值
适合需要明确拆分筛选条件的场景,可读性强:
# 填充Month为1/2/3的缺失Year df.loc[(df['Year'].isna()) & (df['Month'].isin([1,2,3])), 'Year'] = 2022 # 填充Month为10/11/12的缺失Year df.loc[(df['Year'].isna()) & (df['Month'].isin([10,11,12])), 'Year'] = 2021
最优选择
- 若仅处理当前两类Month的简单场景,优先选**
np.where方法**,代码最简洁高效; - 若后续可能扩展更多Month与Year的对应规则,优先选字典映射方法,维护成本更低。
内容的提问来源于stack exchange,提问作者Siddcity
相关产品推荐
相关产品推荐

