Python读写csv文件专题教程(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xo3ylAF9kGs/article/details/90586405

第275篇原创

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

2.3 通用解析框架

dtype

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

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

  2. In [7]: df

  3. Out[7]:

  4. id id.1 age

  5. 0 1 'gz' 10

  6. 1 2 'lh' 12

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

 
  
  1. In [8]: df.dtypes

  2. Out[8]:

  3. id int64

  4. id.1 object

  5. age int64

  6. dtype: object

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

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


  2. In [10]: df

  3. Out[10]:

  4. id id.1 age

  5. 0 1 'gz' 10.0

  6. 1 2 'lh' 12.0


  7. In [11]: df.dtypes

  8. Out[11]:

  9. id int64

  10. id.1 object

  11. age float64

  12. dtype: object

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

 
  
  1. label

  2. 01

  3. 02

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

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


  2. In [49]: df

  3. Out[49]:

  4. id id.1 age label

  5. 0 1 'gz' 10 1

  6. 1 2 'lh' 12 2

如果按照如下指定:

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


  2. In [52]: df

  3. Out[52]:

  4. id id.1 age label

  5. 0 1 'gz' 10 01

  6. 1 2 'lh' 12 02

这样才能符合我们的预期

engine

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

converters

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

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

  2. ...: x)})


  3. In [55]: df

  4. Out[55]:

  5. id id.1 age label

  6. 0 1 'gz' 11 1

  7. 1 2 'lh' 13 2

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

true_values

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

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


  2. In [67]: df

  3. Out[67]:

  4. id id.1 age label

  5. 0 1 'gz' 10 YES

  6. 1 2 'lh' 12 NO

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

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

  2. ...: ['NO'])


  3. In [69]: df

  4. Out[69]:

  5. id id.1 age label

  6. 0 1 'gz' 10 True

  7. 1 2 'lh' 12 False

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

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


  2. In [67]: df

  3. Out[67]:

  4. id id.1 age label

  5. 0 1 'gz' 10 YES

  6. 1 2 'lh' 12 NO

skip_rows

过滤行,数据文件如下:

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


  2. In [16]: df

  3. Out[16]:

  4. id id.1 age label

  5. 0 1 'gz' 10 YES

  6. 1 2 'lh' 12 NO

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

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


  2. In [18]: df

  3. Out[18]:

  4. Empty DataFrame

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

  6. Index: []

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

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

skip_footer

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

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

  2. /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'.

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


  4. In [24]: df

  5. Out[24]:

  6. id id.1 age label

  7. 0 1 'gz' 10 YES

nrows

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

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

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

  2. ...: )

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

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

2.4 文件空值处理

na_values

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

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

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


  2. In [40]: df

  3. Out[40]:

  4. id id.1 age label date

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

  6. 1 2 'lh' 12 NO #

可以使用,na_values实现:

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


  2. In [42]: df

  3. Out[42]:

  4. id id.1 age label date

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

  6. 1 2 'lh' 12 NO NaN

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

skip_blank_lines

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

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


  2. In [54]: df

  3. Out[54]:

  4. id id.1 age label date

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

  6. 1 NaN NaN NaN NaN NaN

  7. 2 2.0 'lh' 12.0 NO #

  8. 3 NaN NaN NaN NaN NaN

verbose

打印一些重要信息,如下

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

  2. Tokenization took: 0.02 ms

  3. Type conversion took: 0.88 ms

  4. Parser memory cleanup took: 0.01 ms

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


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

  1. 时间处理

  2. 迭代

  3. 文件压缩相关

  4. 错误处理

  5. 指定列的类型

  6. 指定列为 Categorical 类型

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

接下来一一总结

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

640?wx_fmt=jpeg

Python与算法社区

猜你喜欢

转载自blog.csdn.net/xo3ylAF9kGs/article/details/90586405