【问题标题】:pd.read_csv by default treats integers like floatspd.read_csv 默认将整数视为浮点数
【发布时间】:2017-02-01 15:22:59
【问题描述】:

我有一个csv,看起来像(标题 = 第一行):

name,a,a1,b,b1
arnold,300311,arnld01,300311,arnld01
sam,300713,sam01,300713,sam01

当我跑步时:

df = pd.read_csv('file.csv')

ab 列的末尾有一个 .0,如下所示:

df.head()

name,a,a1,b,b1
arnold,300311.0,arnld01,300311.0,arnld01
sam,300713.0,sam01,300713.0,sam01

ab 列是整数或空白,那么为什么 pd.read_csv() 将它们视为浮点数,我如何确保它们在读取时是整数?

【问题讨论】:

  • 你用的是什么版本的python和pandas?我无法在 Python 3.5.1 或 Python 2.7.10 中使用 Pandas 0.18.1 复制它
  • “空白”是什么意思?你的意思是NaN 值吗?如果是这样,该列将需要浮点 dtype,因为 NaN 是浮点数,而不是整数。您可能可以有选择地将非NaN 值转换为整数,但我认为这不是可取的。将它们作为整数而不是浮点数有什么好处?
  • Python 版本 = 3.5.1 |Anaconda 2.5.0(64 位)和 Pandas 0.18.1

标签: python csv pandas integer


【解决方案1】:

正如 cmets 中提到的root,这是 Pandas(和 Numpy)的限制。 NaN 是一个浮点数,CSV 中的空值是 NaN。

这也列在 pandas 的 gotchas 中。

您可以通过多种方式解决此问题。

对于下面的示例,我使用以下内容导入数据 - 请注意,我在 ab 列中添加了一个空值的行

import pandas as pd
from StringIO import StringIO

data = """name,a,a1,b,b1
arnold,300311,arnld01,300311,arnld01
sam,300713,sam01,300713,sam01
test,,test01,,test01"""

df = pd.read_csv(StringIO(data), sep=",")

删除 NaN 行

您的第一个选项是删除包含此 NaN 值的行。这样做的缺点是您会丢失整行。将数据放入数据框后,运行以下命令:

df.dropna(inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)

这会从数据框中删除所有 NaN 行,然后将列 a 和列 b 转换为 int

>>> df.dtypes
name    object
a        int32
a1      object
b        int32
b1      object
dtype: object

>>> df
     name       a       a1       b       b1
0  arnold  300311  arnld01  300311  arnld01
1     sam  300713    sam01  300713    sam01

用占位符数据填充NaN

此选项会将您的所有NaN 值替换为丢弃值。该值是您需要确定的。对于这个测试,我做了-999999。这将允许使用保留其余数据,将其转换为 int,并使哪些数据无效。如果您稍后基于列进行计算,您将能够过滤掉这些行。

df.fillna(-999999, inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)

这会产生一个像这样的数据框:

>>> df.dtypes
name    object
a        int32
a1      object
b        int32
b1      object
dtype: object

>>> df
     name       a       a1       b       b1
0  arnold  300311  arnld01  300311  arnld01
1     sam  300713    sam01  300713    sam01
2    test -999999   test01 -999999   test01

保留浮点值

最后,另一种选择是保留浮点值(和NaN)而不用担心非整数数据类型。

【讨论】:

    【解决方案2】:

    使用 Pandas read_csv 将浮点数转换为整数值 - 工作 ===================================== ===============

    # Importing the dataset
    dataset = pd.read_csv('WorldWarWeather_Data.csv')
    X = dataset.iloc[:, 3:11].values
    y = dataset.iloc[:, 2].values
    X=X.astype(int)
    y=y.astype(int)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多