read_csv 将大型 csv 文件字段加载为对象
read_csv loads large csv file fields as objects
为什么 read_csv 会自动将我读取的所有列转换为 'object' 类型?我想读取 10 Gb csv(float 和 Int)并将其加载到 pandas 数据框中。如果我用 panda 或 dask
读取较小的文件(100 MB 或更少),我不会 运行 解决这个问题(所有带数字的列都转换为对象类型)
csv sample
我试图明确指定 dtype,手动作为 read_csv 的一部分;仍然以对象结束(用 df.dtype 阅读后验证)
import pandas as pd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32, 'HorizontalAccuracy':np.int,'RSRP':np.int}
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes
尝试读取文件的第一行并自动获取数据类型,然后使用定义的数据类型读取文件:以所有对象结束
file='D:/path/combine.csv'
col_names=pd.read_csv(file, nrows=0).columns
types_dict=data_type
types_dict.update({col:np.int64 for col in col_names if col not in types_dict})
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes
TypeError: 无法根据规则 'safe' 将数组从 dtype('O') 转换为 dtype('float32')
在处理上述异常的过程中,又出现了一个异常:
ValueError:无法将字符串转换为浮点数:'\x1a'
在显式指定 dtype 时尝试 read_csv 使用 dask;收到有关无法将字符串转换为浮点数的错误
import dask.dataframe as dd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32, 'HorizontalAccuracy':np.int,'RSRP':np.int}
ddf=dd.read_csv(file, dtype=data_type)
ddf.compute()
TypeError: 无法根据规则 'safe' 将数组从 dtype('O') 转换为 dtype('float32')
ValueError:无法将字符串转换为浮点数:'Latitude'
您的代码存在一些问题,最具体地说,您的 csv 文件中的列名称与您分配的数据类型的名称不同。这将引发错误,因为它们需要完全匹配。所以使用这个作为我的输入文件(我试图尽可能多地复制你的):
Location_Lat,Location_Long,Location_H,Location_Z,QOS_RSRP
47.46058,-123.053,6,98588,-115
47.62989,-122.81,87,98312,-114
47.54865,-122.859,9,98312,-113
我注意到您有一个额外的列 (Location_Z),您没有在数据类型中调用它。我设置了一个数据框来分配数据类型,并根据您上面的信息使用指定的列。您可以在 pd.read_csv()
函数中指定您想要的所有内容,如下所示:
import sys
导入 pandas 作为 pd
将 numpy 导入为 np
df = pd.read_csv('fun.csv', header=0, usecols=['Location_Lat',
'Location_Long',
'Location_H',
'QOS_RSRP'],
dtype={'Location_Lat':np.float32,
'Location_Long':np.float32,
'Location_H':np.int,
'QOS_RSRP':np.int}, low_memory=False)
print(df)
print(df.dtypes)
有几点需要注意。我明确分配了 header=0
。这将确保 pandas 使用 csv 的第一行作为您的 header (所以我知道名称将被调用)。如果你想让它成为不同的行,只需设置 header=(line you want)
其次,我告诉 pandas 明确只使用 5 列中的 4 列,因为您没有为 Location_Z
列指定数据类型,所以我没有包括该列,但是如果您想要它,您可以将它包含在上面的 usecols=
参数中,并在 dtype=
参数中指定数据类型。
最后,dtype 字典使用数据框中的列名来分配数据类型。幸运的是,我们为列分配了 header=0
,因此 pandas 已经 "knows" 列名称。在 pandas 中,与字符串 object 相比,浮点数和整数的内存消耗非常低。您的 df 为所有内容返回 object dtypes 的原因是因为 header 可能被读取为 df 的第 1 行,在这种情况下 pandas 会将整列分配为 object数据类型。上面代码打印到屏幕时的结果是:
[dkennetz@hpc02 fun_temp]$ python3.5 pandas_fun.py
Location_Lat Location_Long Location_H QOS_RSRP
0 47.460579 -123.053001 6 -115
1 47.629890 -122.809998 87 -114
2 47.548649 -122.859001 9 -113
Location_Lat float32
Location_Long float32
Location_H int64
QOS_RSRP int64
dtype: object
所以我们可以看到 5 列中只有 4 列被加载到数据帧中,并且数据类型确实是分配的 float32 和 int64。底部的 dtype: object
指的是数据帧本身,它将始终是 pandas.
中的数据帧 object
我希望这能解决您可能遇到的任何问题!
尽管它是数字,但我的超时和将整个大型 csv 读取为对象的问题是由于未指定 "header=0" 造成的。更重要的是 "header=0" 在 read_csv 中的位置将决定它是否会起作用。
密码错误
dd.read_csv(文件, usecols=twr_coln, dtype=data_type, header=0)
正确的代码
dd.read_csv(文件, header=0, usecols=twr_coln, dtype=data_type)
为什么 read_csv 会自动将我读取的所有列转换为 'object' 类型?我想读取 10 Gb csv(float 和 Int)并将其加载到 pandas 数据框中。如果我用 panda 或 dask
读取较小的文件(100 MB 或更少),我不会 运行 解决这个问题(所有带数字的列都转换为对象类型)csv sample
我试图明确指定 dtype,手动作为 read_csv 的一部分;仍然以对象结束(用 df.dtype 阅读后验证)
import pandas as pd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32, 'HorizontalAccuracy':np.int,'RSRP':np.int}
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes
尝试读取文件的第一行并自动获取数据类型,然后使用定义的数据类型读取文件:以所有对象结束
file='D:/path/combine.csv'
col_names=pd.read_csv(file, nrows=0).columns
types_dict=data_type
types_dict.update({col:np.int64 for col in col_names if col not in types_dict})
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes
TypeError: 无法根据规则 'safe' 将数组从 dtype('O') 转换为 dtype('float32') 在处理上述异常的过程中,又出现了一个异常: ValueError:无法将字符串转换为浮点数:'\x1a'
在显式指定 dtype 时尝试 read_csv 使用 dask;收到有关无法将字符串转换为浮点数的错误
import dask.dataframe as dd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32, 'HorizontalAccuracy':np.int,'RSRP':np.int}
ddf=dd.read_csv(file, dtype=data_type)
ddf.compute()
TypeError: 无法根据规则 'safe' 将数组从 dtype('O') 转换为 dtype('float32') ValueError:无法将字符串转换为浮点数:'Latitude'
您的代码存在一些问题,最具体地说,您的 csv 文件中的列名称与您分配的数据类型的名称不同。这将引发错误,因为它们需要完全匹配。所以使用这个作为我的输入文件(我试图尽可能多地复制你的):
Location_Lat,Location_Long,Location_H,Location_Z,QOS_RSRP
47.46058,-123.053,6,98588,-115
47.62989,-122.81,87,98312,-114
47.54865,-122.859,9,98312,-113
我注意到您有一个额外的列 (Location_Z),您没有在数据类型中调用它。我设置了一个数据框来分配数据类型,并根据您上面的信息使用指定的列。您可以在 pd.read_csv()
函数中指定您想要的所有内容,如下所示:
import sys
导入 pandas 作为 pd 将 numpy 导入为 np
df = pd.read_csv('fun.csv', header=0, usecols=['Location_Lat',
'Location_Long',
'Location_H',
'QOS_RSRP'],
dtype={'Location_Lat':np.float32,
'Location_Long':np.float32,
'Location_H':np.int,
'QOS_RSRP':np.int}, low_memory=False)
print(df)
print(df.dtypes)
有几点需要注意。我明确分配了 header=0
。这将确保 pandas 使用 csv 的第一行作为您的 header (所以我知道名称将被调用)。如果你想让它成为不同的行,只需设置 header=(line you want)
其次,我告诉 pandas 明确只使用 5 列中的 4 列,因为您没有为 Location_Z
列指定数据类型,所以我没有包括该列,但是如果您想要它,您可以将它包含在上面的 usecols=
参数中,并在 dtype=
参数中指定数据类型。
最后,dtype 字典使用数据框中的列名来分配数据类型。幸运的是,我们为列分配了 header=0
,因此 pandas 已经 "knows" 列名称。在 pandas 中,与字符串 object 相比,浮点数和整数的内存消耗非常低。您的 df 为所有内容返回 object dtypes 的原因是因为 header 可能被读取为 df 的第 1 行,在这种情况下 pandas 会将整列分配为 object数据类型。上面代码打印到屏幕时的结果是:
[dkennetz@hpc02 fun_temp]$ python3.5 pandas_fun.py
Location_Lat Location_Long Location_H QOS_RSRP
0 47.460579 -123.053001 6 -115
1 47.629890 -122.809998 87 -114
2 47.548649 -122.859001 9 -113
Location_Lat float32
Location_Long float32
Location_H int64
QOS_RSRP int64
dtype: object
所以我们可以看到 5 列中只有 4 列被加载到数据帧中,并且数据类型确实是分配的 float32 和 int64。底部的 dtype: object
指的是数据帧本身,它将始终是 pandas.
我希望这能解决您可能遇到的任何问题!
尽管它是数字,但我的超时和将整个大型 csv 读取为对象的问题是由于未指定 "header=0" 造成的。更重要的是 "header=0" 在 read_csv 中的位置将决定它是否会起作用。
密码错误 dd.read_csv(文件, usecols=twr_coln, dtype=data_type, header=0) 正确的代码 dd.read_csv(文件, header=0, usecols=twr_coln, dtype=data_type)