合并两个DataFrame时遇警告:浮点值与其整数表示不相等
解决Pandas Join时的类型不匹配警告(已统一float仍触发)
问题重现
执行以下代码合并两个DataFrame:
joined_df = Register.join( ledger, lsuffix='Register', rsuffix='ledger', on='Gross', how='left')
收到警告:
<ipython-input-63-87afd279f9b6>:1: UserWarning: You are merging on int and float columns where the float values are not equal to their int representation.
已将两个DataFrame的Gross列都转为float64类型,但警告依然存在。
原因分析
虽然表面上两列都是float64,但Pandas的合并检测逻辑会检查数值的实际特征:如果其中一列的浮点数全部是整数形式(如5.0、10.0),而另一列包含非整数值(如5.5),就会被判定为“本质上的int与float合并”,从而触发警告。另外,浮点数的精度误差也可能间接导致这类检测异常。
解决方案
1. 确认列值是否为整数,统一转为int类型(推荐)
如果Gross列的业务含义是整数,只是被存为了浮点数,先验证所有值是否为整数:
# 检查两列是否全为整数型浮点数 print(Register['Gross'].apply(lambda x: x.is_integer()).all()) print(ledger['Gross'].apply(lambda x: x.is_integer()).all())
如果结果都是True,直接转为整数类型再合并:
Register['Gross'] = Register['Gross'].astype('int64') ledger['Gross'] = ledger['Gross'].astype('int64') # 重新执行合并 joined_df = Register.join( ledger, lsuffix='Register', rsuffix='ledger', on='Gross', how='left')
2. 统一浮点精度(适用于确实需要浮点类型的场景)
如果Gross列必须保留浮点类型,通过四舍五入统一精度,避免数值特征差异触发警告:
# 根据业务需求保留小数位数,示例为2位 Register['Gross'] = Register['Gross'].round(2) ledger['Gross'] = ledger['Gross'].round(2) # 重新执行合并 joined_df = Register.join( ledger, lsuffix='Register', rsuffix='ledger', on='Gross', how='left')
3. 临时禁用该警告(不推荐,仅在确认无问题时使用)
如果已经确认数据无问题,只是想屏蔽警告:
import warnings # 精准匹配警告信息,避免屏蔽其他有用警告 warnings.filterwarnings( 'ignore', category=UserWarning, message='You are merging on int and float columns where the float values are not equal to their int representation.' ) # 执行合并 joined_df = Register.join( ledger, lsuffix='Register', rsuffix='ledger', on='Gross', how='left')
内容的提问来源于stack exchange,提问作者Abbas Syed
相关产品推荐
相关产品推荐

