cod*_*nob 11 python csv integer pandas
我有一个csv看起来像(headers =第一行):
name,a,a1,b,b1
arnold,300311,arnld01,300311,arnld01
sam,300713,sam01,300713,sam01
Run Code Online (Sandbox Code Playgroud)
当我跑:
df = pd.read_csv('file.csv')
Run Code Online (Sandbox Code Playgroud)
列a和b有一个.0连接到像这样的结尾:
df.head()
name,a,a1,b,b1
arnold,300311.0,arnld01,300311.0,arnld01
sam,300713.0,sam01,300713.0,sam01
Run Code Online (Sandbox Code Playgroud)
列a和b整数或空格,所以为什么pd.read_csv()像浮点数一样对待它们?如何确保它们在读取时是整数?
jua*_*nca 13
我知道这是一个老问题,但当前答案中缺少选项。
您可以指定列的类型,在示例中应该类似于:
df = pd.read_csv('file.csv', dtype={'a': 'Int32', 'b': 'Int32'})
Run Code Online (Sandbox Code Playgroud)
pandas 会将缺失值设置为<NA>
正如评论中提到的root,这是Pandas(和Numpy)的限制.NaN是一个浮点数,您在CSV中的空值是NaN.
这也列在熊猫的陷阱中.
您可以通过几种方式解决此问题.
对于下面的例子中我用下面的导入数据-注意,我在列加了一行空值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=",")
Run Code Online (Sandbox Code Playgroud)
您的第一个选择是删除包含此NaN值的行.这样做的缺点是你会失去整排.将数据导入数据帧后,运行以下命令:
df.dropna(inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)
Run Code Online (Sandbox Code Playgroud)
这会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
Run Code Online (Sandbox Code Playgroud)
NaN占位符数据此选项将NaN使用丢弃值替换所有值.这个值是你需要确定的.对于这个测试,我做到了-999999.这将允许使用保留其余数据,将其转换为int,并使数据无效.如果您稍后根据列进行计算,则可以过滤这些行.
df.fillna(-999999, inplace=True)
df.a = df.a.astype(int)
df.b = df.b.astype(int)
Run Code Online (Sandbox Code Playgroud)
这会产生如下数据帧:
>>> 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
Run Code Online (Sandbox Code Playgroud)
最后,另一种选择是保留浮点值(和NaN)而不用担心非整数数据类型.