如何利用df2将df1中特定日期的MP10值设为NaN?
解决方法:将df2的NaN值更新到df1对应位置
这里提供两种简洁有效的实现方式:
方法1:合并后用combine_first替换
先通过日期列(day/month/year)合并两个DataFrame,再用df2的NaN值覆盖df1的对应位置:
import pandas as pd import numpy as np # 原始df1定义 df = { "day": [1, 2, 3, 4, 5, 6, 7], "month": [1, 1, 4, 4, 7, 7, 7], "year": [2015, 2015, 2016, 2017, 2017, 2019, 2019], "mp10": [10, 15, 20, 5, 7, 14, 18] } df1 = pd.DataFrame(df) # 用于替换的df2定义 df = { "day": [2, 5, 7], "month": [1, 7, 7], "year": [2015, 2017, 2019], "mp10": [np.NaN, np.NaN, np.NaN] } df2 = pd.DataFrame(df) # 按日期列左合并,保留df1所有行 merged = pd.merge(df1, df2, on=['day', 'month', 'year'], how='left', suffixes=('_orig', '_new')) # 替换逻辑:有df2匹配的用NaN,无匹配的保留原数值 df1['mp10'] = merged['mp10_new'].combine_first(merged['mp10_orig'])
方法2:用update方法直接更新
通过设置日期列为索引,使用update方法高效替换匹配位置的值:
# 为两个DataFrame设置日期复合索引 df1_idx = df1.set_index(['day', 'month', 'year']) df2_idx = df2.set_index(['day', 'month', 'year']) # 仅更新与df2索引匹配的行,将对应mp10设为NaN df1_idx.update(df2_idx) # 恢复原始的列索引结构(可选操作) df1 = df1_idx.reset_index()
两种方法都能精准实现需求:将df1中与df2日期匹配的mp10值替换为NaN,不匹配的行保持原数值。
内容的提问来源于stack exchange,提问作者Daniel M M
相关产品推荐
相关产品推荐

