《利用python进行数据分析》读书笔记之文本格式数据的读写

数据读取基础

将表格型数据读取为DataFrame对象是数据分析的重要一步。read_csv和read_table可能是后期我们使用的最多的函数。下面总结了书上给出的pandas中常用的解析函数。

函数描述
read_scv从文件、URL或文件型对象读取分隔号的数据,逗号是默认分隔符
read_table从文件、URL或文件型对象读取分隔好的数据
read_fwf从特定宽度格式的文件中读取分隔好的数据,制表符(’\t’)是默认分隔符
read_clipboardread_table的剪贴板版本,在将表格从Web页面上转换成数据时有用
read_excel从Excel的XLS或者XLSX文件中读取表格数据
read_hdf读取用pandas存储的HDF5文件
read_html从HTML文件中读取所有表格数据
read_json从JSON(JavaScript Object Notation) 字符串中读取数据
read_msgpack读取MessagePac二级制格式的pandas数据
read_pickle读取以Python pickle格式存储的任意对象
read_sas读取存储在SAS系统中定制存储格式的SAS数据集
read_sql将SQL查询的结果(使用SQLAlchemy)读取为pandas的DataFrame
read_stata读取Stata格式的数据集
read_feather读取Feather二进制格式

一些数据载入函数,比如read_csv,会进行类型推断,那就意味着不需要指定哪一列是数值、整数、布尔值或者字符串。其他的数据格式,比如HDF5,Feather和msgpack格式中已经存储了数据的类型。

在尝试使用read_csv读取数据之前,我们需要先创建一个简单的csv文件作为例子,具体步骤为:

  1. 新建一个txt文件,按类似下图的格式(逗号分隔)输入数据,保存
  2. 将txt文件重新命名为ex1.csv
    创建一个简单的CSV文件
    在py文件的相同目录创建一个名称为examples的文件夹,将csv文件放入,之后进行文件的读取:
import pandas as pd

df = pd.read_csv('examples/ex1.csv')
print(df)
#    a   b   c   d message
# 0  1   2   3   4   hello
# 1  5   6   7   8   world
# 2  9  10  11  12     foo

我们也可以使用read_table进行读取,此时我们需要指定分隔符为逗号:

df = pd.read_table('examples/ex1.csv',sep=',')
print(df)
#    a   b   c   d message
# 0  1   2   3   4   hello
# 1  5   6   7   8   world
# 2  9  10  11  12     foo

在某些情况下,一张表的分隔符不是固定的,这时我们也可以给read_table中的sep选项传入正则表达式来进行处理,这里不再赘述。
一些文件不包含表头行,如下面这个CSV文件:
不包含表头行的CSV文件
如果我们想要正常的读取这类文件,需分配列名,我们可以让pandas自动分配列名,也可以自己指定列名:

import pandas as pd

df = pd.read_csv('examples/ex2.csv',header = None)
#    0   1   2   3      4
# 0  1   2   3   4  hello
# 1  5   6   7   8  world
# 2  9  10  11  12    foo
df = pd.read_csv('examples/ex2.csv',names = ['a','b','c','d','message'])
#    a   b   c   d message
# 0  1   2   3   4   hello
# 1  5   6   7   8   world
# 2  9  10  11  12     foo

如果想要指定某一列作为索引,如message那一列,则可以指定index_col为4或者’message’:

df = pd.read_csv('examples/ex2.csv',names = ['a','b','c','d','message'],index_col=4)
df = pd.read_csv('examples/ex2.csv',names = ['a','b','c','d','message'],index_col='message')
#          a   b   c   d
# message
# hello    1   2   3   4
# world    5   6   7   8
# foo      9  10  11  12

我们可以使用skiprow参数来跳过异常文件的某些行,考虑下面这个CSV文件:
异常的CSV文件
现在我们使用skiprow来保证数据的正常读取:

df = pd.read_csv('examples/ex3.csv',names = ['a','b','c','d','message'],skiprows=[0,2,3])
print(df)
#    a   b   c   d message
# 0  1   2   3   4   hello
# 1  5   6   7   8   world
# 2  9  10  11  12     foo

默认情况下,pandas将NULL和NA视为缺失值,考虑下面这个CSV文件:
含有缺失值的CSV文件
现在我们使用pandas对其进行读取并观察结果:

df = pd.read_csv('examples/ex4.csv')
print(df)
#   someting  a   b     c   d message
# 0      one  1   2   3.0   4     NaN
# 1      two  5   6   NaN   8   world
# 2    three  9  10  11.0  12     foo

我们可以通过列表的形式传入na_values,列表中的元素将被视为缺失值:

df = pd.read_csv('examples/ex4.csv',na_values=[1,'two'])
print(df)
#   someting    a   b     c   d message
# 0      one  NaN   2   3.0   4     NaN
# 1      NaN  5.0   6   NaN   8   world
# 2    three  9.0  10  11.0  12     foo

我们可以通过字典的形式传入na_values,这样就可以指定每列被视为NaN的值:

df = pd.read_csv('examples/ex4.csv',na_values={'message':['foo'],'someting':['one']})
print(df)
#   someting  a   b     c   d message
# 0      NaN  1   2   3.0   4     NaN
# 1      two  5   6   NaN   8   world
# 2    three  9  10  11.0  12     NaN

我们注意到就算没有被指定,NA和NULL也被视为缺失值
下面是常见的read_csv/read_table函数的参数:

参数描述
path表明文件系统位置的字符串、URL或文件型对象
sep或者delimiter用于分隔每行字段的字符序列或者正则表达式
header用作列名的行号,默认是0(第一行),如果没有的话,应该为None
index_col用作结果中行索引的列号或者列名,可以使一个单一的名称/数字,也可以是一个分层索引
skiprows从文件开头处起,需要调过的行数或者行号列表
na_values需要用NA替换的值序列
comment在行结尾处分隔注释的字符
parse_dates尝试将数据解析为datetime,默认是Fasle。如果是True,将尝试解析所有的列,=也可以指定列号或者列名表来进行解析。如果列表的元素是元组或者列表,将会把多个列组合到一起进行解析
keep_date_col如果连接到解析日期上,保留被连接的列,默认是Fasle
converters包含列名称映射到函数的字典
dayfrist解析非明确日期时,按照国际格式处理(例如7/6/2012->June,7,2012),默认为False
squeeze如果解析的数据只包含一列,返回一个Series
thousands千位分隔符(如’,‘或者’.’)

分块读入文件

我们可以调整DataFrame显示的行数:

pd.options.display.max_rows = 10
#设置每次打印DataFrame时只显示10行(前5行和倒数5行)

可以在读取数据时,给nrows传值以读入一部分行:

df = pd.read_csv('examples/ex5.csv',nrows = 3)
#读取三行

可以分块读入数据,将每块的行数传给chunksize即可:

df = pd.read_csv('examples/ex6.csv',chunksize = 2)
#分块读取,每个块含两行数据

注意此时read_csv返回的是一个可迭代对象而不是一个DataFrame,可以使用for循环来遍历每一个块(DataFrame对象)

将数据输出为文件

现在考虑之前创建的CSV文件(ex4):
含有缺失值的CSV文件
现在我们将ex4读取后写入到另一个名为out的CSV文件中:

df = pd.read_csv('examples/ex4.csv')
#   someting  a   b     c   d message
# 0      one  1   2   3.0   4     NaN
# 1      two  5   6   NaN   8   world
# 2    three  9  10  11.0  12     foo
df.to_csv('examples/out.csv')
#z这里na_rep = 'NULL'的意思是在写出时将缺失值替换为字符串'NULL'

得到的结果如下,默认是以逗号分隔,我们也可以给sep传参数以使文件以其他分隔符进行分隔:
输出的CSV文件
另外我们注意到写出时不仅将列标签写出,默认的行标签也被写出,这里我们可以给to_csv方法中另heafer和index为False来禁止写出列标签和行标签
我们也可以只输出DataFrame的一部分列:

df.to_csv('examples/out.csv',index = False,columns=['a','b','c'])

结果如下:
输出部分列
另外Series对象也可以输出为CSV文件,操作类似,在这里不在赘述。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值