You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:55:06