基于pandas对表格型数据的加载和存储操作
基于pandas对表格型数据的读取操作
读写文本格式的数据
pandas(关于pandas的介绍,请看https://blog.****.net/weixin_45640609/article/details/104730070)提供了一些用于将表格型数据读取为DataFrame对象的函数。
这里用表格列举出来
函数 | 说明 |
---|---|
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
read_tablc | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(’\t’) |
read_fwf | 读取定宽列格式数据(也就是说,没有分隔符) |
read_clipboard | 读剪贴板中的数据,可以看做 readtable的剪贴版。再将网页转换为表格时很有用 |
read_excel | 从Excel XLS或XLSX file 读取表格数据 |
read_hdf | 读取pandas写的HDF5文件 |
read_html | 读取HTML文档中的所有表格 |
read_json | 读取JSON(JavaScript Object Notation)字符串中的数据 |
read_megpack | 二进制格式编码的 pandas数据 |
read_pickle | 读取Python pickle格式中存储的任意对象 |
read_sas | 读取存储于SAS系统自定义存储格式的SAS数据集 |
read_sql | (使用SQLAlchemy)读取SQL 查询结果为pandas的 DataFrame |
read_stata | 读取Stata文件格式的数据集 |
read_feather | 读取Feather二进制文件格式 |
虽然有这么多的函数,但是其中read_csv和read_table是我们今后用的最多的。
下面我们来看一下有关于文件读取的例子:
例如,同目录下,这里有一个名为demo1.csv(逗号分隔的文本文件),文本内容如下:
- 我们先用read_csv的方式来读取该文件
发现,成功读取了文件,并且自动编辑了行号
- 用read_table的方式读取该文件,sep指定以“,”来分割。
接下来我们可以看看读取文件的数据是什么格式的
可以发现,是DataFrame格式的,说明我们可以对该数据进行相关的操作
你还可以让pandas分配默认的列名,也可以自己定义列名
默认分配列名:
定义header=None
则pandas会自动分配默认的列名
自己定义列名:names
参数,就是给自定义列名用的
假设你希望将message列做成DataFrame的索引。你可以明确表示要将该列放到索引4的位置上,也可以通过index_col参数定"message":
例如:
有些情况下,有些表格可能不是⽤固定的分隔符去分隔字段的(⽐如空⽩符或其它模式)。看看下⾯
这个⽂本⽂件:
虽然可以⼿动对数据进⾏规整,这⾥的字段是被数量不同的空⽩字符间隔开的。这种情况下,你可以
传递⼀个正则表达式作为read_table的分隔符。可以⽤正则表达式表达为‘\s+’。
所以,可以这样写("\s+"是匹配空白字符(\n,\r,\t,空格))
这⾥,由于列名⽐数据⾏的数量少,所以read_table推断第⼀列应该是DataFrame的索引。
另外,我们可以用skiprows
跳过⽂件中不重要的部分
例如,我有这样一个文件
第二行和第四行对我们来说,是无关紧要的,可以通过skiprows
跳过,python索引从0开始,所以这里写1,3
缺失值处理是⽂件解析任务中的⼀个重要组成部分。缺失数据经常是要么没有(空字符串),要么⽤某个标记值表示。默认情况下,pandas会⽤⼀组经常出现的标记值进⾏识别,⽐如NA及NULL:
例如,我有一个demo3文件,内容大致这样
这里我用read_csv来读取
na_values可以⽤⼀个列表或集合的字符串表示缺失值,字典的各列可以使⽤不同的NA标记值:
就是说可以指定那些数据为“NA”(无效)
read_csv和read_table函数的参数
参数 | 说明 |
---|---|
path | 表示文件系统位置、URL、文件型对象的字符串 |
sep或delimiter | 用于对行中各字段进行拆分的字符序列或正则表达式 |
header | 用作列名的行号。默认为0(第一行),如果没有header行就应该设置为None |
index_col | 用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(层次化索引) |
names | 用于结果的列名列表,结合header=None |
skiprows | 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始) |
na_values | 一组用于替换NA的值 |
comment | 用于将注释信息从行尾拆分出去的字符(一个或多个) |
parse_dates | 尝试将数据解析为日期,默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中) |
keep_date_col | 如果连接多列解析日期,则保持参与连接的列。默认为False。 |
converters | 由列号/列名跟函数之间的映射关系组成的字典。例如,“foo:f)会对foo列的所有值应用函数f |
dayfirst | 当解析有歧义的日期时,将其看做国际格式(例如,7/6/2012→June7,2012)。默认为False |
nrows | 需要读取的行数(从文件开始处算起) |
iterator | 返回一个TextParser以便逐块读取文件 |
chunksize | 文件块的大小(用于迭代) |
skip_footer | 需要忽略的行数(从文件末尾处算起) |
verbose | 打印各种解析器输出信息,比如“非数值列中缺失值的数量”等 |
encoding | 用于unicode的文本编码格式。例如,“utf-8”表示用UTF-8编码的文本 |
squeeze | 如果数据经解析后仅含一列,则返回Series |
这么多的参数并不一定全都记下来,记住几个常用的就行
逐块读取文本文件
在处理很⼤的⽂件时,或找出⼤⽂件中的参数集以便于后续处理时,你可能只想读取⽂件的⼀⼩部分
或逐块对⽂件进⾏迭代。
在看⼤⽂件之前,我们先设置pandas显示地更紧些:
例如,我们可以使pd.options.display.max_rows = 5
展示最大行数为5
如果只想读取⼏⾏(避免读取整个文件),通过nrows进⾏指定即可:
要逐块读取⽂件,可以指定chunksize(⾏数):
例如:
将数据写出到文本格式
数据也可以被输出为分隔符格式的⽂本
利⽤DataFrame的to_csv⽅法,我们可以将数据写到⼀个以逗号分隔的⽂件中:
例如:
当然,还可以使⽤其他分隔符
例如:
显示结果:
Series也有⼀个to_csv⽅法:
JSON数据
JSON(JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应⽤程序之间发送数据的标准格式之⼀。它是⼀种⽐表格型⽂本格式(如CSV)灵活得多的数据格式。
通过json.loads即可将JSON字符串转换成Python形式::
** json.dumps则将Python对象转换成JSON格式:**
如何将(⼀个或⼀组)JSON对象转换为DataFrame或其他便于分析的数据结构就由你决定了。最简单⽅便的⽅式是:向DataFrame构造器传⼊⼀个字典的列表(就是原先的JSON对象),并选取数据字段的⼦集:
pandas.read_json可以⾃动将特别格式的JSON数据集转换为Series或DataFrame。
例如:
我这里有一个json文件,内容大致为
这里用read_json函数来读取
同样的,也可以用to_json方法将DataFrame保存为json文件
读取Microsoft Excel文件
pandas的ExcelFile类或pandas.read_excel函数⽀持读取存储在Excel 2003(或更⾼版本)中的表格型数据。
要使⽤ExcelFile,通过传递xls或xlsx路径创建⼀个实例,存储在表单中的数据可以read_excel读取到DataFrame.
例如:
如果要将pandas数据写⼊为Excel格式,你必须⾸先创建⼀个ExcelWriter,然后使⽤pandas对象的
to_excel⽅法将数据写⼊到其中:
也可以不使⽤ExcelWriter,⽽是传递⽂件的路径到to_excel:
参考书籍:《利用python进行数据分析》