pd.read情况下,www.example.com _csv将整数视为浮点数

mcdcgff0  于 2023-05-11  发布在  其他
关注(0)|答案(5)|浏览(118)

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

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()将它们视为浮点数,以及如何确保它们在读取时是整数?

htzpubme

htzpubme1#

正如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值的行。这样做的缺点是,您会丢失整行。将数据放入dataframe后,运行以下命令:

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

这将删除 Dataframe 中的所有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)

这会产生一个类似这样的dataframe:

>>> 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

保留float值

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

tzcvj98z

tzcvj98z2#

我知道这是一个老问题,但在目前的答案中有缺失的选项。
你可以指定列的类型,在例子中应该是这样的:

df = pd.read_csv('file.csv', dtype={'a': 'Int32', 'b': 'Int32'})

pandas将缺失值设置为<NA>

6rvt4ljy

6rvt4ljy3#

使用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)
ddhy6vgd

ddhy6vgd4#

我在一些Django代码中使用了这个方法来将格式化的 Dataframe 渲染成HTML。
我没有列类型或列数的先验知识。
任何一列都有很大可能是NaN
我想在真正的浮点数上设置精度,并保持整数值不变。
NaN设置为永远不会使用的整数值(假设)
使用convert_dtypes()再次推断类型,而不使用NaN
将虚拟值转换回NaN(或仅使用Python None

df.fillna(-999999, inplace=True)
df = df.convert_dtypes()
df = df.replace(-999999, None)

现在,由于缺少值而被推断为浮点数的整数列被正确地标识为整数。
假设数据集中不会有任何合法的值-999999,这种用法是安全的假设。
请注意,convert_dtypes()float64更改为Float64,并将int64更改为Int64,这是以后应用样式等时需要记住的:

dfs = df.style.format(subset=list(df.select_dtypes(include='Float64')), precision=self.precision, na_rep='')
6qftjkof

6qftjkof5#

我使用pandas 1.5.3,下面的代码保持整数值,尽管列中有NaN值。

df = pd.read_csv("file.csv", dtype=object)

相关问题