【问题标题】:Set data type for specific column when using read_csv from pandas使用 pandas 中的 read_csv 时为特定列设置数据类型
【发布时间】:2018-06-01 11:49:40
【问题描述】:

我有一个大的 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?

谢谢

【问题讨论】:

  • 我能想到的一个技巧:将所有列读取为 int8。然后使用usecols 仅将第 4000 列读取为 int32。然后在第一个数据框中替换它。

标签: python pandas


【解决方案1】:

如果您确定数字,您可以像这样重新创建字典:

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。

【讨论】:

    【解决方案2】:

    由于您没有标题,因此列名是它们出现的整数顺序,即第一列是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)
    

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2018-02-20
      • 1970-01-01
      • 2015-09-03
      • 2014-10-21
      • 1970-01-01
      • 2017-11-06
      • 2018-05-25
      相关资源
      最近更新 更多