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

如何在Pandas中用另一DataFrame匹配值替换目标DataFrame的NA列值

Pandas替换DataFrame中NA值为对应分组均值的解决方案

问题场景

现有两个DataFrame:

  • df1包含DateTime和Radiation列,其中部分Radiation值为NA:
DateTimeRadiation
1/1/20170.23
1/1/20170.23
1/2/20170.23
1/3/20170.23
2/5/2017NA
  • df2是按DateTime分组后计算的Radiation均值,需用df2的均值替换df1中对应DateTime的NA值。

原代码失效原因

你之前的代码中,df1[df1.Radiation.isna()]返回的是原DataFrame的副本,对副本的列赋值不会同步到原df1,所以NA值未被更新。

有效解决方案

方法一:使用loc直接定位赋值

通过map获取对应DateTime的均值,再用loc直接修改原DataFrame的指定位置:

# 将df2转为以DateTime为索引的Series,方便映射
mean_series = df2.set_index('DateTime')['Radiation']
# 获取需要替换的行对应的均值
target_values = df1[df1.Radiation.isna()]['DateTime'].map(mean_series)
# 用loc定位原df的NA行,赋值对应均值
df1.loc[df1.Radiation.isna(), 'Radiation'] = target_values

方法二:结合fillna与字典映射

先将df2的均值转为字典,再通过map映射后填充NA:

# 将df2转为{DateTime: 均值}的字典
mean_dict = df2.set_index('DateTime')['Radiation'].to_dict()
# 对Radiation列的NA值,用DateTime映射字典中的均值填充
df1['Radiation'] = df1['Radiation'].fillna(df1['DateTime'].map(mean_dict))

方法三:修正原merge逻辑

保留merge的思路,但改用loc赋值:

merged_df = df1[df1.Radiation.isna()].merge(df2, on='DateTime', how='left')
# 用loc定位原df的NA行,赋值merged_df中的均值列
df1.loc[df1.Radiation.isna(), 'Radiation'] = merged_df['Radiation_y']

内容的提问来源于stack exchange,提问作者Anirban Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:26