如何在Pandas中用另一DataFrame匹配值替换目标DataFrame的NA列值
Pandas替换DataFrame中NA值为对应分组均值的解决方案
问题场景
现有两个DataFrame:
- df1包含
DateTime和Radiation列,其中部分Radiation值为NA:
| DateTime | Radiation |
|---|---|
| 1/1/2017 | 0.23 |
| 1/1/2017 | 0.23 |
| 1/2/2017 | 0.23 |
| 1/3/2017 | 0.23 |
| 2/5/2017 | NA |
- 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
相关产品推荐
相关产品推荐

