[英]Pandas DataFrame: when using read_csv, rows with blanks are converting entire column to “object” data type
[英]Set data type for specific column when using read_csv from pandas
我有一个大 csv 文件(~10GB),大约有 4000 列。 我知道我期望的大部分数据是 int8,所以我设置:
pandas.read_csv('file.dat', sep=',', engine='c', header=None,
na_filter=False, dtype=np.int8, low_memory=False)
问题是,最后一列(第 4000 个位置)是 int32,我可以告诉 read_csv 默认使用 int8,在第 4000 列使用 int 32 吗?
谢谢
如果您确定数字,您可以像这样重新创建字典:
dtype = dict(zip(range(4000),['int8' for _ in range(3999)] + ['int32']))
考虑到这有效:
import pandas as pd
import numpy as np
data = '''\
1,2,3
4,5,6'''
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, dtype={0:'int8',1:'int8',2:'int32'}, header=None)
print(df.dtypes)
返回:
0 int8
1 int8
2 int32
dtype: object
从文档:
dtype : 类型名称或列的字典 -> 类型,默认无
数据或列的数据类型。 例如 {'a': np.float64, 'b': np.int32} 使用 str 或 object 来保留而不是解释 dtype。 如果指定了转换器,它们将被应用于 dtype 转换的 INSTEAD。
由于您没有标题,列名是它们出现的整数顺序,即第一列是df[0]
。 要将最后一列以编程方式设置为int32
,您可以读取文件的第一行以获取数据框的宽度,然后构造一个您要使用的整数类型的字典,并将列数作为键。
import numpy as np
import pandas as pd
with open('file.dat') as fp:
width = len(fp.readline().strip().split(','))
dtypes = {i: np.int8 for i in range(width)}
# update the last column's dtype
dtypes[width-1] = np.int32
# reset the read position of the file pointer
fp.seek(0)
df = pd.read_csv(fp, sep=',', engine='c', header=None,
na_filter=False, dtype=dtypes, low_memory=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.