【问题标题】:How to deal with NaN values in pandas (from csv file)?如何处理熊猫中的 NaN 值(来自 csv 文件)?
【发布时间】:2020-01-06 17:05:46
【问题描述】:

我有一个相当大的 csv 文件,其中包含从用于材料测试(压缩测试)的机器获得的数据。数据的标题是 Time、Force、Stroke,由于样本量的原因,它们重复了 10 次,所以最后一组标题是 Time.10、Force.10、Stroke.10。由于实验的性质,并非所有列的长度都相同(有些比其他列长约 2000 行)。当我使用 pandas 将文件导入我的 IDE(spyder 或 jupyter)时,csv 文件中空行中的所有单元格都标记为 NaN。问题是......我不能在具有 NaN 值的列内或列之间进行任何数学运算,因为它们被视为 str。我在几乎所有论坛上都尝试过最推荐的解决方案; .fillna()、dropna()、replace() 和 interpolate()。上述方法有效,但仅在视觉上有效,例如df.fillna(0) 用 0 替换所有 NaN 值,但是当我尝试例如在列中找到最大值,我仍然收到错误消息,指出我的列中有字符串(TypeError: '>' not supported between 'float' and 'str')。 NaN 值 100% 导致问题是 csv 文件中的空单元格的结果,因为我已经导入了一个 csv 文件,其中所有列的长度相同(没有空单元格)并且没有问题。如果有人对此问题有任何解决方案(不需要在 pandas 中,只需在 python 中)我被困了 2 周以上,我将不胜感激。

【问题讨论】:

  • na_values 选项可能对 pandas 有用 read_csv (pandas.pydata.org/pandas-docs/stable/reference/api/…)
  • 我认为您的数据中可能存在其他问题。 fillna() 正常工作的事实意味着这些值实际上是 NaN 值,而不是字符串 'nan',它是 float() 类型,并且允许您进行数学运算。您是否检查过其他字符串值? [i for i in df['column'] if isinstance(i,str)]
  • @G.Anderson 是的,我的文件中没有字符串。这些值是 NaN,但我文件中的数值都是十进制数。也许这是我的问题,是否应该将 NaN 转换为 nan ......例如0.0 而不是用 0 替换 NaN?
  • 解决了!对我有用的解决方案是:df.fillna(method="ffill")。我不是专业人士(显然),所以我不能告诉你为什么只有这种方法有效,但它确实有效。
  • @lignum 使用 'ffill' 来填充空单元格会在其中添加错误值,并且会破坏这些列上的数学计算

标签: python pandas csv nan


【解决方案1】:

尝试 read_csv()na_filter=False。 这至少应该防止将“空”源单元格设置为 NaN

但请注意:

  • 这样的“空”单元格可以有一个空字符串作为内容,
  • 包含至少一个这样的单元格的每一列的类型是object (不是数字),
  • 所以(暂时)他们不能参加任何数字 操作。

所以可能,在 read_csv() 之后你应该:

  • 用例如替换这样的空字符串0(或任何数值),
  • 调用 to_numeric(...) 以从 object 更改每一列的类型 在每种情况下适用于任何数字类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多