如何基于字典列表匹配填充Pandas DataFrame的空缺列值
Pandas 多键匹配填充DataFrame空缺值解决方案
原代码错误原因
- 调用
DataFrame.to_dict()时未指定orient参数,默认返回{列名: {行索引: 对应值}}的列导向字典,并非预期的逐行记录列表,遍历过程中取row['name']会直接报错。 - 即使通过
to_dict('records')得到行字典列表,修改字典也不会同步更新原DataFrame,且循环匹配的方式在数据量较大时效率极低,不符合Pandas的向量化处理逻辑。
正确实现代码
import pandas as pd # 原始数据 list_validation = [ {'name': 'Alice', 'street': 'Baker Street', 'stamp': 'T05', 'city': 'London'}, {'name': 'Margaret', 'street': 'Castle Street', 'stamp': 'T01', 'city': 'Cambridge'}, {'name': 'Fred', 'street': 'Baker Street', 'stamp': 'T012', 'city': 'London'} ] df = pd.DataFrame({ 'name': ['Fred', 'Jane', 'Alice', 'Margaret'], 'street': ['Baker Street', 'Downing Street', 'Baker Street', 'Castle Street'], 'stamp': ['', 'T03', '', ''], 'city': ['', 'London', '', ''], 'other irrelevant columns for this task' : [1, 2, 3, 4] }) # 1. 将验证字典列表转为DataFrame,设置匹配键为索引 df_val = pd.DataFrame(list_validation).set_index(['name', 'street']) # 2. 原df空字符串转NA方便填充,同时设置相同的匹配索引 df = df.replace({'': pd.NA}).set_index(['name', 'street']) # 3. 按索引匹配填充空缺,优先保留原df已有的非空值 df[['stamp', 'city']] = df[['stamp', 'city']].fillna(df_val) # 4. 重置索引恢复原结构,剩余空缺转回空字符串 df = df.reset_index().fillna('')
运行后得到的df即为符合需求的结果:原有的非空值(如Jane的stamp=T03、city=London)会完整保留,匹配成功的空缺值会被list_validation的对应数据填充,未匹配到的空缺保持为空。
注:你给出的预期结果中Margaret的street字段为手误,原始df中该值为Castle Street,匹配后stamp为T01、city为Cambridge,符合逻辑。
内容的提问来源于stack exchange,提问作者Paulina
相关产品推荐
相关产品推荐

