使用字典调用pandas的.map()方法时,目标列始终为空
问题排查:DataFrame.map()匹配字典值全为空的问题
问题背景
从GitHub读取的键值对字典结构如下:
{"Absetzung":50, "Amtsantritt":42, "Amtseinführung":41, "Aufenthalt":20, "Aufnahme":20, "Aufschwörung":20}
DataFrame包含列名:
column_names = ["factoid_ID", "pers_ID", "pers_name", "alternative_names", "event_type", "event_after-date", "event_before-date", "event_start", "event_end", "event_date", "pers_title", "pers_function", "place_name", "inst_name", "rel_pers", "source_quotations", "additional_info", "comment", "info_dump", "source_combined", "event_value", "source", "source_site"]
已成功将文本转为有效字典(可通过键直接取值),但使用df3['event_type'].map(event_value_dict)给event_value列赋值时,该列始终为空。
可能原因
- 键值不匹配:
event_type列的内容与字典键存在细微差异,比如:- 前后存在空格(如
" Aufschwörung "vs"Aufschwörung") - 大小写不一致(德语名词通常首字母大写,若列中内容为小写则无法匹配)
- 特殊字符(如变音符号
ü)编码不一致,导致字符表面相同但实际不匹配
- 前后存在空格(如
- 空值/NaN存在:
event_type列包含空值,map()会将空值转为NaN,若大部分值为空则看起来全列空 - 数据类型不匹配:
event_type列的数据类型不是字符串(如数值类型),与字典的字符串键无法匹配
解决办法
1. 清理event_type列内容
先统一列内容格式,消除匹配障碍:
# 去除前后空格 df3['event_type'] = df3['event_type'].str.strip() # 统一首字母大写(匹配字典键的德语名词格式) df3['event_type'] = df3['event_type'].str.title() # 找出不匹配的键,方便排查 unmatched = set(df3['event_type'].dropna()) - set(event_value_dict.keys()) if unmatched: print("不匹配的event_type值:", unmatched)
2. 处理空值
先检查空值数量,再决定处理方式:
# 查看空值数量 print("event_type空值数量:", df3['event_type'].isna().sum()) # 填充空值(可选,根据业务需求调整) df3['event_type'] = df3['event_type'].fillna('Unknown') # 若需要给未知值赋值,在字典中添加对应键 event_value_dict['Unknown'] = 0
3. 确保数据类型一致
检查并转换event_type为字符串类型:
# 查看当前数据类型 print("event_type数据类型:", df3['event_type'].dtype) # 转换为字符串 df3['event_type'] = df3['event_type'].astype(str)
4. 替换map()为apply()调试
使用get()方法明确查看匹配失败的情况:
df3['event_value'] = df3['event_type'].apply(lambda x: event_value_dict.get(x, '未匹配')) # 查看未匹配的行 print(df3[df3['event_value'] == '未匹配'])
完成上述步骤后,再执行map()或直接用apply()赋值即可正常匹配。
内容的提问来源于stack exchange,提问作者OnceUponATime
相关产品推荐
相关产品推荐

