如何合并列dtype不一致的两个DataFrame?解决类型转换报错问题
解决DataFrame州代码列类型不匹配的合并问题
问题核心是两个DataFrame的州代码用了不同的编码体系:一个是字符串格式的州缩写(比如'AL'),另一个是整数格式的州数字代码,直接转类型肯定会报错,因为字符串无法直接转成整数。下面是两种可行的解决思路:
方法一:将字符串州缩写转为数字代码
- 先建立州缩写到数字代码的映射字典(参考美国邮政标准对应关系,示例如下):
state_abbr_to_num = { 'AL': 1, 'AK': 2, 'AZ': 4, 'AR': 5, 'CA': 6, 'CO': 8, 'CT': 9, 'DE': 10, 'FL': 12, 'GA': 13, 'HI': 15, 'ID': 16, 'IL': 17, 'IN': 18, 'IA': 19, 'KS': 20, 'KY': 21, 'LA': 22, 'ME': 23, 'MD': 24, 'MA': 25, 'MI': 26, 'MN': 27, 'MS': 28, 'MO': 29, 'MT': 30, 'NE': 31, 'NV': 32, 'NH': 33, 'NJ': 34, 'NM': 35, 'NY': 36, 'NC': 37, 'ND': 38, 'OH': 39, 'OK': 40, 'OR': 41, 'PA': 42, 'RI': 44, 'SC': 45, 'SD': 46, 'TN': 47, 'TX': 48, 'UT': 49, 'VT': 50, 'VA': 51, 'WA': 53, 'WV': 54, 'WI': 55, 'WY': 56 }
- 使用
map()方法转换第一个DataFrame的列:
# 转换列类型,同时处理不匹配的情况(比如不存在的缩写设为NaN) Enterprise3['US Postal State Code'] = Enterprise3['US Postal State Code'].map(state_abbr_to_num) # 可选:如果需要删除不匹配的行 Enterprise3 = Enterprise3.dropna(subset=['US Postal State Code']) # 转成int64类型(map后可能是float类型,因为存在NaN) Enterprise3['US Postal State Code'] = Enterprise3['US Postal State Code'].astype('int64')
- 现在两个DataFrame的列类型一致,执行合并:
merged_df = pd.merge(Enterprise3, df2, on='US Postal State Code')
方法二:将数字代码转为州缩写
如果更倾向于保留字符串格式,也可以把第二个DataFrame的数字列转成州缩写:
- 建立反向映射字典:
state_num_to_abbr = {v: k for k, v in state_abbr_to_num.items()}
- 转换第二个DataFrame的列:
df2['US Postal State Code'] = df2['US Postal State Code'].map(state_num_to_abbr)
- 合并两个DataFrame:
merged_df = pd.merge(Enterprise3, df2, on='US Postal State Code')
注意事项
- 确保映射字典的准确性,严格对应美国邮政的官方州代码(比如DC对应11、PR对应72等,如果你的数据包含这些地区,需要补充到字典里)
- 转换后检查是否有NaN值,这些是无法匹配的无效数据,根据业务需求选择删除或填充
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

