pandas merge合并DataFrame时如何复现指定ValueError报错
复现方法
你之前复现失败的核心原因是:只要列中存在字符串类型的值,pandas就会将整列dtype推断为object,永远得不到float64类型的合并键,自然触发不了对应类型校验报错。
pandas 1.4.3版本中该报错的触发条件非常明确:参与merge的两个关联键,一个为object dtype,另一个为float64 dtype时,就会在merge前置校验阶段直接抛出目标错误,和列内存储的具体值无关。
可直接复现报错的代码
只需要保证两个关联键类型符合要求即可,以下代码在pandas 1.4.3环境下运行100%抛出指定报错:
import pandas as pd import numpy as np data = pd.DataFrame({ 'PB website': ["http://www.ghi.de", "http://www.jkl.de", "http://www.def.de", "http://www.abc.de", "http://www.xyz.de"], 'PB match': [21, 22, 23, 24, 25], 'PB location': ["Süd 4", "Süd 2", "Süd 5", "Süd 3", "Süd 8"], 'PB country': ['Deutschland', 'Deutschland', 'Deutschland', 'Deutschland', 'Deutschland'], }) processed_urls = ['http://www.abc.de', 'http://www.def.de', 'http://www.ghi.de', 'http://www.xyz.de', 'http://www.jkl.de'] flags = [False, True, True, False, True] # 关键修改:构造右表时将关联键url设置为float64类型 right_df = pd.DataFrame({'url': np.arange(5, dtype=np.float64), 'verlinkt': flags}) processed = pd.merge(left=data, right=right_df, left_on='PB website', right_on='url', how='right')
运行后抛出的报错完全匹配目标:
ValueError: You are trying to merge on object and float64 columns. If you wish to proceed you should use pd.concat
注意事项
- 你也可以反过来将左表的
PB website列设置为float64类型,右表url列保留原来的字符串object类型,同样可以触发该报错,核心逻辑完全一致。 - 不要尝试通过给字符串列加NaN的方式修改dtype,字符串列即使存在缺失值,dtype仍然是
object,不会变成float64,无法触发报错。
内容的提问来源于stack exchange,提问作者PParker
相关产品推荐
相关产品推荐

