基于Año_Comunidad匹配,用另一DataFrame填充目标DataFrame空值
基于Año_Comunidad匹配填充DataFrame空值的正确方法
你的问题核心是没有通过Año_Comunidad这个匹配键将两个DataFrame的行对应起来,导致之前的填充代码完全无法生效。以下是两种可行的解决方案:
方案一:通过合并(merge)实现填充
这种方法先将两个表基于匹配键合并,再用合并后的对应列填充空值:
# 从analisis2中提取需要的匹配键和填充列,确保每个Año_Comunidad只保留一条数据 fill_source = analisis2[['Año_Comunidad', 'Super_95', 'Diesel', 'Salario en euros anuales']].drop_duplicates('Año_Comunidad') # 左连接analisis和填充源表 merged_df = analisis.merge(fill_source, on='Año_Comunidad', how='left', suffixes=('', '_fill')) # 逐列填充空值 analisis['Super_95'] = merged_df['Super_95'].fillna(merged_df['Super_95_fill']) analisis['Diesel'] = merged_df['Diesel'].fillna(merged_df['Diesel_fill']) analisis['Salario en euros anuales'] = merged_df['Salario en euros anuales'].fillna(merged_df['Salario en euros anuales_fill']) # 若需要填充Comunidad列,同理操作 # analisis['Comunidad'] = merged_df['Comunidad'].fillna(merged_df['Comunidad_fill'])
方案二:利用字典映射快速填充
通过匹配键创建映射字典,直接用map方法匹配填充:
# 为每个需要填充的列创建{Año_Comunidad: 对应值}的字典 super95_mapping = analisis2.set_index('Año_Comunidad')['Super_95'].to_dict() diesel_mapping = analisis2.set_index('Año_Comunidad')['Diesel'].to_dict() salario_mapping = analisis2.set_index('Año_Comunidad')['Salario en euros anuales'].to_dict() # 仅填充原表中的空值 analisis['Super_95'] = analisis['Super_95'].fillna(analisis['Año_Comunidad'].map(super95_mapping)) analisis['Diesel'] = analisis['Diesel'].fillna(analisis['Año_Comunidad'].map(diesel_mapping)) analisis['Salario en euros anuales'] = analisis['Salario en euros anuales'].fillna(analisis['Año_Comunidad'].map(salario_mapping))
你之前代码的错误原因
你之前的代码逻辑完全偏离需求:
- 没有基于
Año_Comunidad将两个表的行关联,只是单独处理analisis2['Super_95']列; - 错误地将
Super_95的数值与字符串'2020Islas Baleares'做比较,这显然不是匹配键的内容,最终只能填充这个固定字符串或NaN,根本无法对应到正确的行数据。
内容的提问来源于stack exchange,提问作者Anitta
相关产品推荐
相关产品推荐

