微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pd.read_csv默认情况下处理像浮点数这样的整数

我有一个看起来像csv(headers =第一行):

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

当我跑:

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

列a和b的末尾附有.0,如下所示:

df.head()

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

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

解决方法:

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

这也列在了gotchas的熊猫中.

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

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

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)而不用担心非整数数据类型.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐