尝试对两个数据帧进行连接时出现错误:“... float 值不等于它们的 int 表示”

问题描述 投票:0回答:1
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.

我的账本数据类型

更改数据类型后仍然出现此错误。我的总成绩是两个数据帧 float64

pandas
1个回答
0
投票

假设您正在调查可疑交易,并希望根据交易总金额将

Register
数据框中的公司与
ledger
数据框中的客户进行匹配:

Register = pd.DataFrame({
    'Company': ['A', 'B', 'C'],
    'Gross': [1000.4, 0.0, 3000.1],
})

ledger = pd.DataFrame({
    'Gross': [1000.4, 3000.1, 0.0],
    'Client': ['X', 'Y', 'Z']
})

你可以尝试这样的事情:

Register.join(ledger,
    lsuffix='Register',
    rsuffix='ledger',
    on='Gross',
    how='left')
  Company  GrossRegister  Grossledger Client
0       A         1000.4          NaN    NaN
1       B            0.0       1000.4      X
2       C         3000.1          NaN    NaN
<ipython-input-82-3d8c02c1639e>:1: UserWarning: You are merging on int and float columns where the float values are not equal to their int representation.

我们可以看到,加入没有成功,B 公司怎么了?

让我们检查一下 DataFrame.join 文档中的示例

使用键列加入的另一个选项是使用 on 参数。 DataFrame.join 总是使用其他索引,但我们可以使用 df 中的任何列。

警告的原因是您的代码没有连接两个 Gross 列(均为 float64),它试图将 Register 数据帧的 Gross 列与账本数据帧的 index 相连接(这是一个 int) ),因此发出警告。

为了解决这个问题,我们需要将账本数据帧的索引设置为 Gross:

Register.join(ledger.set_index('Gross'),
    on='Gross',
    lsuffix='Register',
    rsuffix='ledger',
    how='left')
  Company   Gross Client
0       A  1000.4      X
1       B     0.0      Z
2       C  3000.1      Y

顺便说一句,如果 Gross 列中的值都是整数,那么 Pandas 根本不会给我们任何警告,这会使问题更难调试。我检查了 ChatGPT 如何回答您的问题,它建议对总金额进行四舍五入,这可能有助于防止精度问题,并在总金额四舍五入为整数时使警告消失,但不符合您的要求!

© www.soinside.com 2019 - 2024. All rights reserved.