【问题标题】:Log transformation-ValueError: cannot convert float NaN to integer日志转换-ValueError:无法将浮点 NaN 转换为整数
【发布时间】:2021-11-12 22:20:56
【问题描述】:

某些列的数据不服从正态分布,我想通过对数变换对其进行归一化。

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14,6))
#1
sns.distplot(train_df['MasVnrArea'], fit=stats.norm, ax=ax[0])
ax[0].set_title('Before Normalization')

#2
train_df['MasVnrArea'] = np.log(train_df['MasVnrArea'])
ax[1].set_title('After Normalization')
sns.distplot(train_df['MasVnrArea'], fit=stats.norm, ax=ax[1])

#1 部分工作正常,但是当涉及#2 部分时,它给了我这个错误:

ValueError: cannot convert float NaN to integer

我已经检查了此列中是否有 NaN 值,但什么也没有。那么它有什么问题呢?

【问题讨论】:

  • 难以调试,因为我们无权访问您的数据。你能发布一个有代表性的数据集吗?否则很难提供帮助。
  • Kaggle 的数据集之一。 house price

标签: python pandas normalization valueerror normal-distribution


【解决方案1】:

您何时检查是否存在 NaN 值?

您是否检查过train_df['MasVnrArea'] 的值是否等于或小于0? 如果存在等于或小于 0 的值,则日志返回 NaN,并且下一行中的绘图将抛出错误。

  • 对数计算后再次检查是否有NaN值。

示例来自Using numpy.log() on 0

import numpy as np 
print(np.log(0))

输出:

-inf 
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in log

说明:

未定义零的对数。这不是一个实数,因为你永远无法通过将任何事物提升到其他事物的幂来得到零。

【讨论】:

  • 它的值等于 0,但不低于 0。是的,我检查了转换后是否有 NaN 值并且没有它们。
  • 这就是问题所在。未定义 0 的日志。
  • 有时在 numpy.log 中返回“-inf”。
  • 谢谢,这就是问题所在。所以不能通过对数变换来归一化。
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2018-04-30
  • 1970-01-01
相关资源
最近更新 更多