pd.read_csv 默认情况下将整数视为浮点数

新手上路,请多包涵

我有一个 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() 将它们视为读取时的浮点数和整数?

原文由 codingknob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 616
1 个回答

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

这也列在 pandas 的 陷阱 中。

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

对于下面的示例,我使用以下内容导入数据 - 请注意,我在列 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)

This drops all NaN rows from the dataframe, then it converts column a and column b to an 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 )而不用担心非整数数据类型。

原文由 Andy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进