如何在不更改熊猫原始数据类型的情况下读取csv

时间:2018-11-09 14:41:25

标签: python pandas dataframe

我正在读取csv,并且我不希望将列的数据类型作为对象,它们应该是int,float,str等。

data = pd.read_csv(file_path+files, delimiter='\t', error_bad_lines=False)

data.dtypes:
  Time       object
  Code        int64
  Address     object
  dtype: object

有什么办法可以使我们在读取时从csv中读取原始数据类型:

预期:

data.dtypes:
  Time        int
  Code        int64
  Address     str

我有一个看起来像这样的数据框:

df:
    A     B    C
    abc   10   20
    def   30   50  
    cfg   90   60
    pqr   str  50
    xyz   75   56

我想摆脱列“ B”不是“ int”的行。由于B的dtype被设置为“对象”,因此我无法这样做。

4 个答案:

答案 0 :(得分:2)

您可以向dtype提供read_csv() kwarg。从文档中:

  

dtype:类型名称或列的字典->类型,默认为无

     

数据或列的数据类型。例如。 {“ a”:np.float64,“ b”:np.int32}将str或object与适当的na_values设置一起使用可保留而不解释dtype。如果指定了转换器,则会将它们应用于dtype转换。

例如

data = pd.read_csv(..., dtype={'Time': np.int64})

编辑:正如@ALollz所指出的,如果无法转换指定列中的数据,这将中断。如果要使用不同位数的数据(例如np.int32而不是np.int64)读数据,通常会使用它。

您可以将DataFrame上的df['Time'].astype(int)ojbect一起使用,以诊断引起转换问题的数据。

答案 1 :(得分:1)

您可以轻松转换数字类型的列:

data['Time'] = data['Time'].astype(int)

尽管您的字符串字段的dtype是一个字符串对象,但它仍作为对象被卡住。我相信有可能创建一个显式为字符串的新dtype,但我不知道这样做有什么好处。

对于已编辑的问题,您要做的是定义一个转换器(因为您的文件没有针对该列的已定义数据类型)

import numpy as np

def col_fixer(x):
    try:
        return int(x)
    except ValueError:
        return np.nan

data = pd.read_csv(file_path+files, delimiter='\t', converters=dict(B=col_fixer))

然后,您可以根据需要丢弃带有NA的行。

答案 2 :(得分:0)

要绕过Pandas的错误类型推断,请使用csv阅读器将字符串提供给DataFrame构造函数。

private generateImage(fileArray: Array<any>): Observable<Image> {
  return from(fileArray.map((image) => this.buildImage(image)));
}

答案 3 :(得分:0)

#ex.csv 
# -0.11566111265093704,0.7655813,0
# 0.8792716084627679,0.82952684,1
# 0.5744048344633055,0.8762405,2
# -0.6245665678004078,0.24478662,3
# -0.33955465349370706,-0.042879142,4

curfile = pd.read_csv("ex.csv", dtype={0: np.float64, 1: np.float32, 2: int}, header=None)

print(type(curfile.iloc[0,0]), type(curfile.iloc[0,1]), type(curfile.iloc[0,2]))

# <class 'numpy.float64'> <class 'numpy.float32'> <class 'numpy.int32'>