如何将州-邮编字典的值有效映射到DataFrame列?解决返回NaN问题
问题分析与解决方案
你的代码返回NaN的核心原因是字典推导式生成的映射键和DataFrame中的邮编不匹配,结合你的数据场景,分两种情况解决:
1. 你的temp字典结构是「州名: 单个邮编」
比如:
temp = {'Sachsen': '38440', 'Niedersachsen': '20867'}
你原来的推导式{item: k for k, v in temp.items() for item in v}会把单个邮编字符串拆成单个字符(比如'38440'会被遍历为'3'、'8'、'4'、'4'、'0'),生成的字典键是单个字符,自然和DataFrame中完整的邮编匹配不上。
正确写法
直接反转字典的键值对,生成「邮编: 州名」的映射:
# 生成邮编到州的映射字典 zip_to_state = {v: k for k, v in temp.items()} # 映射到DataFrame df['states'] = df['zipcode'].map(zip_to_state)
2. 你的temp字典结构是「州名: 邮编列表」
比如:
temp = {'Sachsen': ['38440', '38441'], 'Niedersachsen': ['20867', '20868']}
你原来的推导式逻辑是对的,但需要确保DataFrame中zipcode的类型和字典中邮编的类型完全一致:
- 如果字典里的邮编是字符串,而DataFrame里的是整数,需要转类型:
df['zipcode'] = df['zipcode'].astype(str) - 如果字典里的邮编是整数,而DataFrame里的是字符串,转成整数:
df['zipcode'] = df['zipcode'].astype(int)
完整代码示例
# 生成邮编到州的映射字典 zip_to_state = {item: k for k, v in temp.items() for item in v} # 统一类型后映射 df['zipcode'] = df['zipcode'].astype(str) # 根据实际情况调整类型 df['states'] = df['zipcode'].map(zip_to_state)
额外排查点
- 检查
temp字典的实际结构,确认每个州对应的是单个邮编还是邮编列表 - 用
print(df['zipcode'].unique())查看DataFrame中的邮编值,再用print(zip_to_state.keys())查看映射字典的键,确认两者是否有重叠的有效值 - 如果部分邮编在映射字典中不存在,对应行的
states列仍会返回NaN,这属于正常情况,需要补充对应的州-邮编映射
内容的提问来源于stack exchange,提问作者Priyadharshini Ravi
相关产品推荐
相关产品推荐

