完整导图
如果导入的某些列为时间类型,但是导入时没有为此参数赋值,导入后就不是时间类型,如下:
In [5]: df = pd.read_csv('test.csv',sep='\s+',header=0,na_values=['#']) In [6]: df Out[6]: id id.1 age label date0 1 'gz' 10 YES 1989-12-11 2 'lh' 12 NO NaNIn [7]: df.dtypes Out[7]: id int64id.1 objectage int64label objectdate objectdtype: objectdate列此时类型为object,想办法转化为时间型:
In [8]: df = pd.read_csv('test.csv',sep='\s+',header=0,na_values=['#'],parse_dat ...: es=['date']) In [9]: df Out[9]: id id.1 age label date0 1 'gz' 10 YES 1989-12-011 2 'lh' 12 NO NaTIn [11]: df.dtypes Out[11]: id int64id.1 objectage int64label objectdate datetime64[ns]此时的类型为datetime.
date_parser参数定制某种时间类型,详细使用过程总结如下。我们的数据文件:
In [82]: cat test.csv id id age label date1 'gz' 10 YES 26-MAY-20192 'lh' 12 NO 30-MAR-2019如果时间格式转化成标准的年月日,操作如下:
In [83]: df = pd.read_csv('test.csv',sep='\s+',parse_dates=['date'],date_parser= ...: lambda dates: pd.datetime.strptime(dates,'%d-%b-%Y')) In [84]: df Out[84]: id id.1 age label date0 1 'gz' 10 YES 2019-05-261 2 'lh' 12 NO 2019-03-30转化为timetuple格式,如下:
In [85]: df = pd.read_csv('test.csv',sep='\s+',parse_dates=['date'],date_parser= ...: lambda dates: pd.datetime.strptime(dates,'%d-%b-%Y').timetuple()) In [86]: df Out[86]: id id.1 age label date0 1 'gz' 10 YES (2019, 5, 26, 0, 0, 0, 6, 146, -1)1 2 'lh' 12 NO (2019, 3, 30, 0, 0, 0, 5, 89, -1)infer_datetime_format 参数默认为 boolean, default False如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。
逐快读入内存
取值 boolean, default False返回一个TextFileReader 对象,以便逐块处理文件。
这个在文件很大时,内存无法容纳所有数据文件,此时分批读入,依次处理。具体操作演示如下,我们的文件数据域一共有2行。
先读入一行,get_chunk参数1表示一次读入一行
In [105]: chunk = pd.read_csv('test.csv',sep='\s+',iterator=True) In [106]: chunk.get_chunk(1) Out[106]: id id.1 age label date date10 1 'gz' 10 YES 26-MAY-2019 4-OCT-2017再读入下一行,
In [107]: chunk.get_chunk(1) Out[107]: id id.1 age label date date11 2 'lh' 12 NO 30-MAR-2019 2-SEP-2018此时已到文件末尾,再次读入会报异常,
In [108]: chunk.get_chunk(1) StopIteration Traceback (most recent call last)<ipython-input-108-f294b07af62c> in <module>----> 1 chunk.get_chunk(1)chunksize: int, default None设置文件块的大小
参数取值为 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。
如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。
In [119]: df = pd.read_csv('test.zip',sep='\s+',compression='zip') In [120]: df Out[120]: id id.1 age label date date10 1 'gz' 10 YES 26-MAY-2019 4-OCT-20171 2 'lh' 12 NO 30-MAR-2019 2-SEP-2018thousands : str, default None千分位分割符,如“,”或者“."
如下,显示数据文件 test.csv
In [122]: cat test.csv id id age label date1 'gz' 10 YES 1,090,0012 'lh' 12 NO 20,010其中date列为带千分位分隔符的整形,如果我们不显示指定thousands参数,则读入后的date列类型为object. 如下:
In [125]: df = pd.read_csv('test.csv',sep='\s+') In [126]: df Out[126]: id id.1 age label date0 1 'gz' 10 YES 1,090,0011 2 'lh' 12 NO 20,010In [127]: df.dtypes Out[127]: id int64id.1 objectage int64label objectdate objectdtype: object如果显示指定thousands为,,则读入后date列显示为正常的整型。
In [128]: df = pd.read_csv('test.csv',sep='\s+',thousands=',') In [132]: df Out[132]: id id.1 age label date0 1 'gz' 10 YES 10900011 2 'lh' 12 NO 20010In [130]: df['date'].dtypes Out[130]: dtype('int64')decimal : str, default ‘.’字符中的小数点 (例如:欧洲数据使用’,‘). 类别上面的thousands参数。
float_precision : string, default None指定c引擎的浮点数转化器,默认为普通,参数可能取值还包括:high-precision, round_trip.
lineterminator: str (length 1), default None行分割符,只在C解析器下使用。
quotechar: str (length 1), optional引号,用作标识开始和解释的字符,引号内的分割符将被忽略。
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。
escapechar: str (length 1), default None当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。
comment: str, default None标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。
这个参数只能是一个字符,空行(就像skip_blank_lines=True),注释行被header和skiprows忽略一样。例如,如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c'作为header。
encoding: str, default None指定字符集类型,通常指定为'utf-8'. List of Python standard encodings
dialect: str or csv.Dialect instance, default None如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档
error_bad_lines : boolean, default True如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将该行剔除(只能在C解析器下使用)。
我们故意修改test.csv文件某个单元格的取值(带有两个空格,因为我们的数据文件默认分隔符为两个空格)
In [148]: cat test.csv id id age label date1 'gz' 10.8 YES 1,090,0012 'lh' 12.31 NO O 20,010此时,读入数据文件,会报异常:
ParserError: Error tokenizing data. C error: Expected 5 fields in line 3, saw 6在小样本读取时,这个错误很快就能发现,但是在读取大数据文件时,假如读了1个小时,最后几行出现了这类错误,就很闹心!所以稳妥起见,我们一般都会将error_bad_lines设置为False, 也就是剔除此行, 同时使用下节的 warn_bad_lines 设置为True,打印剔除的这行。
In [150]: df = pd.read_csv('test.csv',sep='\s+',error_bad_lines=False) b'Skipping line 3: expected 5 fields, saw 6\n'In [151]: df Out[151]: id id.1 age label date0 1 'gz' 10.8 YES 1,090,001可以看到输出的警告信息:Skipping line 3: expected 5 fields, saw 6
warn_bad_lines : boolean, default True如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。
参数 tupleize_cols,不推荐使用。
以上就是读csv文件的所有参数及对应演示。
本专题为 Python与算法社区 公众号出品,转载请注明出处。
Python与算法社区
