第275篇原创

上篇:Python读写csv文件专题教程(1)

2.3 通用解析框架

dtype

承接前文,test.csv读入后数据框如下:

In [6]: df = pd.read_csv('test.csv',sep='\s+')

In [7]: df

Out[7]:

id id.1 age

0 1 'gz' 10

1 2 'lh' 12

使用dtypes查看每一列的数据类型,如下:

In [8]: df.dtypes

Out[8]:

id int64

id.1 object

age int64

dtype: object

如果我想修改age列的数据类型为float,read_csv时可以使用dtype调整,如下:

In [9]: df = pd.read_csv('test.csv',sep='\s+',dtype={'age':float})

In [10]: df

Out[10]:

id id.1 age

0 1 'gz' 10.0

1 2 'lh' 12.0

In [11]: df.dtypes

Out[11]:

id int64

id.1 object

age float64

dtype: object

这个参数有用之处可能体现在如下这个例子,就是我某列的数据:

label

01

02

如果不显示的指定此列的类型str, read_csv解析引擎会自动判断此列为整形,如下在原test.csv文件中增加上面一列,如果不指定dtype, 读入后label列自动解析为整型

In [48]: df = pd.read_csv('test.csv',sep='\s+')

In [49]: df

Out[49]:

id id.1 age label

0 1 'gz' 10 1

1 2 'lh' 12 2

如果按照如下指定:

In [51]: df = pd.read_csv('test.csv',sep='\s+',dtype={'label':str})

In [52]: df

Out[52]:

id id.1 age label

0 1 'gz' 10 01

1 2 'lh' 12 02

这样才能符合我们的预期

engine

Pandas目前的解析引擎提供两种:c, python,默认为c, 因为c引擎解析速度更快,但是特性没有python引擎高,如果使用c引擎没有的特性时,会自动退化为python引擎。

converters

converters参数是键为某列,值为函数的字典,它完成对列数据的变化操作,如下所示:

In [54]: df = pd.read_csv('test.csv',sep='\s+',converters={'age':lambda x:1+int(

...: x)})

In [55]: df

Out[55]:

id id.1 age label

0 1 'gz' 11 1

1 2 'lh' 13 2

完成对age列的数据加1,注意int(x),此处解析器默认所有列的类型为str,所以需要显示类型转换。

true_values

true_values参数指定数据中哪些字符应该被清洗为True, 同理,false_values参数指定哪些字符被清洗为False. 如下所示,修改原数据文件label列的值为:

In [66]: df = pd.read_csv('test.csv',sep='\s+',true_values=['YES'])

In [67]: df

Out[67]:

id id.1 age label

0 1 'gz' 10 YES

1 2 'lh' 12 NO

现在,我想转化 YES 为 True, NO 为 False. 这样使用参数:

In [68]: df = pd.read_csv('test.csv',sep='\s+',true_values=['YES'],false_values=

...: ['NO'])

In [69]: df

Out[69]:

id id.1 age label

0 1 'gz' 10 True

1 2 'lh' 12 False

注意!这里有处Pandas的parses.py模块该优化的地方,只指定YES 转True ,转化会失败,如下:

In [66]: df = pd.read_csv('test.csv',sep='\s+',true_values=['YES'])

In [67]: df

Out[67]:

id id.1 age label

0 1 'gz' 10 YES

1 2 'lh' 12 NO

skip_rows

过滤行,数据文件如下:

In [15]: df = pd.read_csv('test.csv',sep='\s+',header=0)

In [16]: df

Out[16]:

id id.1 age label

0 1 'gz' 10 YES

1 2 'lh' 12 NO

想过滤掉index为0,1的行,使用skip_rows,如下:

In [17]: df = pd.read_csv('test.csv',sep='\s+',header=0,skiprows=[0,1])

In [18]: df

Out[18]:

Empty DataFrame

Columns: [2, 'lh', 12, NO]

Index: []

这与我们预想的不同,通过结果可以揣测skip_rows先发挥作用,此时默认没有header,过滤掉文件的前两行后,此时只剩下第三行,通过header为0,变为df的header. 数据域部分为空。

skiprows还可以被赋值为某种过滤规则的函数

skip_footer

从文件末尾过滤行,解析器退化为python. 这是因为c解析器没有这个特性。

In [23]: df = pd.read_csv('test.csv',sep='\s+',header=0,skipfooter=1)

/home/zglg/anaconda3/bin/ipython:1: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'.

#!/home/zglg/anaconda3/bin/python

In [24]: df

Out[24]:

id id.1 age label

0 1 'gz' 10 YES

nrows

nrows参数设置一次性读入的文件行数,它在读入大文件时很有用,比如16G内存的PC无法容纳几百G的大文件.

此参数可以结合skiprows使用,比如我想从原始文件的第2行(文件第一行为列名)开始一次读入500行,就可以这么写:

df = pd.read_csv('test.csv',sep='\s+',header=None,skiprows = 2, nrows=500

...: )

这样每次读取一个文件片(chunk),直到处理完成整个文件。

解析框架的其他两个参数 low_memory, memory_map是布尔型变量,不再详细解释。

2.4 文件空值处理

na_values

这个参数可以配置哪些值需要处理成Na/NaN, 类型为字典,键指明哪一列,值为看做Na/NaN的字符.

假设我们的数据文件如下,date列中有一个 #值,我们想把它处理成NaN值。

In [39]: df = pd.read_csv('test.csv',sep='\s+',header=0)

In [40]: df

Out[40]:

id id.1 age label date

0 1 'gz' 10 YES 1989-12-1

1 2 'lh' 12 NO #

可以使用,na_values实现:

In [41]: df = pd.read_csv('test.csv',sep='\s+',header=0,na_values=['#'])

In [42]: df

Out[42]:

id id.1 age label date

0 1 'gz' 10 YES 1989-12-1

1 2 'lh' 12 NO NaN

keep_default_na 是和na_values搭配的,如果前者为True,则na_values被解析为Na/NaN的字符除了用户设置外,还包括默认值。

skip_blank_lines

默认为True, 则过滤掉空行,如为False则解析为NaN. 如下:

In [53]: df = pd.read_csv('test.csv',sep='\s+',header=0,skip_blank_lines=False)

In [54]: df

Out[54]:

id id.1 age label date

0 1.0 'gz' 10.0 YES 1989-12-1

1 NaN NaN NaN NaN NaN

2 2.0 'lh' 12.0 NO #

3 NaN NaN NaN NaN NaN

verbose

打印一些重要信息,如下

In [55]: df = pd.read_csv('test.csv',sep='\s+',header=0,verbose=True)

Tokenization took: 0.02 ms

Type conversion took: 0.88 ms

Parser memory cleanup took: 0.01 ms

分别统计了分词、类型转化、解析器内存清理花费的时长。


read_csv的其他参数还包括如下:

  1. 时间处理

  2. 迭代

  3. 文件压缩相关

  4. 错误处理

  5. 指定列的类型

  6. 指定列为 Categorical 类型

  7. 基于各种应用场景的参数灵活运用

接下来一一总结

本专题为 Python与算法社区 公众号出品,转载请注明出处。

Python与算法社区

c++解析csv 存入数组_Python读写csv文件专题教程(2)相关推荐

  1. python csv 中文乱码_python读写csv时中文乱码问题解决办法

    CSV是英文Comma Separate Values(逗号分隔值)的缩写,顾名思义,文档的内容是由 "," 分隔的一列列的数据构成的,可以使用excel和文本编辑器等打开.CSV ...

  2. python读取csv某一列存入数组_python 读取.csv文件数据到数组(矩阵)的实例讲解

    利用numpy库 (缺点:有缺失值就无法读取) 读: import numpy my_matrix = numpy.loadtxt(open("1.csv","rb&qu ...

  3. python不同数据的读入_python读写不同编码txt文件_python读写txt文件

    python读写不同编码txt文件_python读写txt文件 以后整理规范 [python] view plaincopy import os import codecs filenames=os. ...

  4. 整理Python lxml读写xml文件详细教程

    Python lxml读写xml文件详细教程 xml文档解析 创建xml文档节点 更新xml文档节点 xml文档解析 下面展示详细解析过程. <?xml version='1.0' encodi ...

  5. c++解析csv 存入数组_使用Apache Commons CSV在Java中读写CSV

    介绍 这是专门针对Java读写CSV的库的简短系列文章的第二篇,也是上一篇文章" Core Java读写CSV"的直接续篇. Apache Commons CSV 在Apache的 ...

  6. python本地读csv文件_python读写csv文件方法详细总结

    python提供了大量的库,可以非常方便的进行各种操作,现在把python中实现读写csv文件的方法使用程序的方式呈现出来. 在编写python程序的时候需要csv模块或者pandas模块,其中csv ...

  7. python为什么找不到csv文件_python读写csv文件的方法(还没试,先记录一下)

    该csv模块定义了以下功能: csv.reader(csvfile,dialect ='excel',** fmtparams) 返回一个reader对象,它将迭代给定csvfile中的行. csvf ...

  8. python导入文件列行_python读写csv文件并增加行列的实例代码

    python读写csv文件并增加行列,具体代码如下所示: # -*- coding: utf-8 -*- """ Created on Thu Aug 17 11:28: ...

  9. python 读写csv文件(创建、追加、覆盖)_python 读写csv文件(创建,追加,覆盖)...

    总述: 这篇博客讲述python怎样创建,读写,追加csv文件 创建: 利用csv包中的writer函数,如果文件不存在,会自动创建,需要注意的是,文件后缀一定要是.csv,这样才会创建csv文件 这 ...

最新文章

  1. 80%以上Javaer可能不知道的一个Spring知识点
  2. Oracle 11g+Windows10 x64安装、配置过程记录
  3. Python实现简单的购物车
  4. 英语作文计算机主板,(完整版)电脑主板bios英文版的中英文对照翻译.pdf
  5. pyqt 界面关闭信号_木辛老师的编程课堂之Python和Qt实战慕课软件开发:增加关闭按钮...
  6. linux sshd进程起不来,linux sshd服务异常
  7. css 图片等比例缩小_12个令人惊叹的CSS实验项目
  8. Java方法实现是什么意思_Java中实现可调用的最佳方法是什么,需要一段时间才能完成...
  9. GB-T 15834-2011《标点符号用法》下载链接
  10. 3dmax 对模型做bool运算
  11. SQL标准语句——思维导图
  12. CentOs官网下载,CentOS国内镜像下载
  13. keil中断函数的写法_keil中怎样定义外部中断函数原型?
  14. 树的左视图(Java)
  15. 桌面计算机图标管理打不开怎么回事,电脑桌面计算机图标打不开怎么办
  16. 【Unity】Obi插件系列(五)—— 约束
  17. 大数据可视化技术——平行坐标图、成对关系图、高级折线图
  18. linux手动安装rsync_在Linux/Unix上安装rsync并通过示例的方式介绍使用rsync命令
  19. java 边读边写文件_文件操作--边读边写,在指定位置添加内容(避免乱码)
  20. 用火狐浏览器模拟手机浏览器客户端的方法

热门文章

  1. linux sort 排序 性能,Linux中sort 排序
  2. 精雕道路怎么遍弧形_有网友私信我问郑州融信奥体世纪这个楼盘怎么样他今天来...
  3. python串口模块_Python使用pip安装pySerial串口通讯模块
  4. 3904三极管是什么功能_什么是放大器。它有什么特性
  5. java ldap 实例_JAVA_基本LDAP操作实例
  6. SQL注入之Mysql报错注入
  7. d778: NOIP2009 2.Hankson的趣味题
  8. ArcGIS的BLOB字段与Access数据库BLOB字段的交换
  9. java 类 解析_Java类详解
  10. dict过滤 python_小猿圈解析Python开发的技巧都有哪些?