- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
6.3 列表综合应用.ipynb @master — view markup · raw · history · blame
6.10 pandas读写数据¶
列表类型经常被用于数据处理,而数据的存在形式主要有两种,一种是文件形式,一种是数据库形式。对于文本文件中数据,可以用遍历的方法简单的读取,对于其他格式的数据文件或存储在数据库中的数据,可以借助Pandas库来读取。
Pandas是基于Numpy的一个开源库,提供了高性能和高可用性的数据结构用于解决数据分析问题,他纳入了大量的库和一些标准的数据模型,提供了可用于高效操作大型数据集的工具,是使Python成为强大而高效的数据分析工具的重要因素之一。
Pandas兼容所有Python的数据类型,除此外,还支持两种数据结构:
一维数组Series
二维表格型数据结构DataFrame
本章,我们只介绍利用Pandas读取数据的相关知识。
Pandas是第三方库,使用之前需要先安装,安装命令:
pip install pandas
通常,Pandas的引用方式为:
import pandas as pd
Pandas输入输出API提供了对文本、二进制和结构化查询语言(SQL)等不同格式类型文件的读写函数,可以方便快速的读取本地文件,如csv、txt、json和html等文本文件、Excel文件以及关系型数据库中的数据。
其主要方法如表6.2所示。
表 6.2 Pandas常用输入输出API
| 格式类型 | 数据描述 | 读 | 写 |
|---|---|---|---|
| 文本 | CSV | read_csv() | to_csv() |
| 文本 | JSON | read_json() | to_json() |
| 文本 | HTML | read_html() | to_html() |
| 二进制 | MS Excel | read_excel() | to_excel() |
| 二进制 | Python Pickle Format | read_pickle() | to_pickle() |
| SQL | SQL | read_sql() | to_sql() |
这些API可以方便的把各种类型的数据读取为Dataframe格式的数据,再用利用tolist()函数便可将其转为列表类型,这样就可以利用本章学习的方法进行数据分析和处理了。
6.10.1 读Excel文件中数据¶
用Pandas可以读取Excel文件中的数据为Dataframe类型,Excel文件的读取主要应用read_excel()方法,使用时可能需要先用“pip install xlrd”安装xlrd模块。
read_excel()方法大部分参数都有默认值,只需要设置少量的参数便可以完成大部分的数据读取工作。
其主要参数及其意义如下:
pd.read_excel(io, sheet_name=0, header=0, names=None, usecols=None, squeeze=False, converters=None, skiprows=None, nrows=None, skipfooter=0)
- io:Excel的存储路径
- sheet_name:要读取的工作表名称,默认读取第一个工作表。可以是整型数字、列表名或SheetN。整型数字:目标sheet所在的位置,以0为起始,比如sheet_name = 1代表第2个工作表。列表名:目标sheet的名称,中英文皆可。SheetN:代表第N个sheet,S要大写,注意与整型数字的区别。
- header:用哪一行作列名。默认为0 ,如果设置为[0,1],则表示将前两行作为多重索引。
- names:自定义最终的列名。一般适用于Excel缺少列名,或者需要重新定义列名的情况。names的长度必须和Excel列长度一致,否则会报错。
- index_col:用作索引的列
- usecols:需要读取哪些列。可以使用整型,从0开始,如[0,2,3];也可以使用Excel传统的列名A、B等字母,如"A:C, E" = "A, B, C, E",注意两边都包括。usecols 可避免读取全量数据,而是以分析需求为导向选择特定数据,提高效率。
- squeeze:当数据仅包含一列。squeeze为True时,返回Series,反之返回DataFrame。
- converters:强制规定列数据类型,主要用途是保留以文本形式存储的数字。 pandas默认将文本类的数据读取为整型,converters 参数可以指定各列数据的类型,如converters = {'出货量':float, '月份':str }, 将“出货量”列数据类型规定为浮点数,“月份”列规定为字符串类型。
- skiprows:跳过特定行。skiprows= n 跳过前n行; skiprows = [a, b, c] 跳过第a+1,b+1,c+1行(索引从0开始)。
- nrows:需要读取的行数,nrows = n 读取前n行。
- skipfooter: 跳过末尾行数,skipfooter = n 跳过末尾的n行。
实例 6.6 读取Excel文件中的证券数据¶
import pandas as pd
data_df = pd.read_excel('images/ch6/6.6 stock.xlsx') # 读取数据为dataframe类型
print(data_df)
import pandas as pd
data_df = pd.read_excel('images/ch6/6.6 stock.xlsx') # 读取数据为dataframe类型
title = data_df.columns.tolist() # dataframe数据中标题行转为列表类型
print('输出列表类型的表头\n',title) # 输出列表类型数据
print()
data_ls = data_df.values.tolist() # dataframe数据转为列表类型
print('输出列表类型的数据\n',data_ls) # 输出列表类型数据
[[Timestamp('2018-01-15 00:00:00'),4.265, 4.56, 1.65, 1.736, 0.92, 1.634],
[Timestamp('2018-01-16 00:00:00'), 4.308, 4.595, 1.7, 1.75, 0.941, 1.631],
[Timestamp('2018-01-17 00:00:00'), 4.295, 4.59, 1.699, 1.74, 0.973, 1.639],
[Timestamp('2018-01-18 00:00:00'), 4.323, 4.621, 1.675, 1.744, 0.98, 1.636],
[Timestamp('2018-01-19 00:00:00'), 4.335, 4.632, 1.683, 1.74, 1.002, 1.63]]
值得注意的是,与遍历方法读取文件不同,用缺省参数读取的数据中,数值类型的数据直接被转为数值型,可以直接参与数值运算和统计分析。
日期读取为日期时间戳类型,可以用strftime()转为字符串。
import pandas as pd
data_df = pd.read_excel('images/ch6/6.6 stock.xlsx') # 读取数据为dataframe类型
data_ls = data_df.values.tolist() # dataframe数据转为列表类型
for lst in data_ls:
lst[0] = lst[0].strftime("%Y-%m-%d") # 日期时间格式化为年-月-日形式
print('输出列表类型的数据\n', data_ls) # 输出列表类型数据
[['2018-01-15', 4.265, 4.56, 1.65, 1.736, 0.92, 1.634],
['2018-01-16', 4.308, 4.595, 1.7, 1.75, 0.941, 1.631],
['2018-01-17', 4.295, 4.59, 1.699, 1.74, 0.973, 1.639],
['2018-01-18', 4.323, 4.621, 1.675, 1.744, 0.98, 1.636],
['2018-01-19', 4.335, 4.632, 1.683, 1.74, 1.002, 1.63]]
pip install openpyxl
6.10.2 读文本文件中数据¶
读文本文件和csv文件进列表,对列表中的数据进行统计分析。将用常规分隔符分隔的文本文件读取到DataFrame可以使用read_csv()方法
其主要参数及意义如下:
pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer', names=None, engine=None,encoding=None)
- filepath_or_buffer:带路径文件名或URL,字符串类型。
- sep:分隔符,缺省值为'\t',当文本中的分隔符不是制表符时,可用sep=’分隔符’来指定。Python可自动检测分隔符。
- delimiter:参数sep的替代参数,缺省值为None。
- header:整型或整型列表,用作列名的行号和数据的开头。
- names:要使用的列名的列表,如果文件不包含标题行,则应显式传递header = None。
- engine:使用解析器引擎,其值可为'c'或'python'。c引擎速度更快,而Python引擎目前功能更加完善。
- encoding:默认None,编码在读/写时用UTF(例如'utf-8')
实例 6.7读取csv文件中的数据¶
import pandas as pd
score_df = pd.read_csv('images/ch6/6.7 score.csv',encoding='utf-8') # dataframe
print(score_df) # 查看数据格式
import pandas as pd
score_df = pd.read_csv('images/ch6/6.7 score.csv',encoding='utf-8') # dataframe
title = score_df.columns.tolist() # dataframe数据中标题行转为列表类型
score_ls = [title] + score_df.values.tolist() # 转为列表类型
print('输出列表类型的数据\n',score_ls) # 输出列表数据
[['姓名', 'C语言', 'Java', 'Python', 'C#']
['罗明', 95, 96, 85, 63, 91],
['朱佳', 75, 93, 66, 85, 88],
['李思', 86, 76, 96, 93, 67],
['郑君', 88, 98, 76, 90, 89],
['王雪', 99, 96, 91, 88, 86]]
6.3.3 读数据库中数据¶
在实际应用中,使用文本文件或Excel存储数据并不是最好的方式,我们能够对这些类型的文件中的数据能的操作非常有限,数据处理效率也不高,更常用的方式是将数据存储到数据库中,通过连接数据库进行相关操作。
目前应用最多的是关系型数据库,关系型数据库的主要构成是二维表。
二维表包含多行多列,把一个表中的数据用Python表现出来,可以用一个列表表示多行,列表的每一个元素用一个元组表示二维表中的一行记录。
比如一个二维表包含ID、姓名、年龄、籍贯、薪水,可以用以下形式表示:
[(1, '李明', 23, '吉林', 20000.00),
(2, '韩雷', 26, '湖北', 25000.00),
(3, '肖红', 30, '江西', 30000.00)]
这种表示方法无法直观的展示关系数据库的表结构,可以使用对象-关系映射 (ORM:Object-Relational Mapping)技术把关系数据库的表结构映射到对象上。在Python中,广泛应用的一个对象-关系映射框架是SQLAlchemy,这个框架可以为开发者提供高效的数据库访问设计和高性能的数据访问方法,实现了完整的企业级持久模型。
SQLAlchemy支持大部分主流数据库,如SQLite、MySQL、Postgres、Oracle、MS SQLServer 和 Firebird等。在使用之前,需要通过pip install sqlalchemy安装这个库。
SQLite是Python 内置的一个轻量级数据库,可以直接使用。使用其他数据库时,需要pip安装与数据库匹配的驱动,例如mysqlclient、 pymssql、 psycopg2、 cx-Oracle或 fdb等。只有安装数据库的驱动之后,才可以连接数据库对数据进行操作。本书以SQLite数据库作为范例进行讲解。
sqlalchemy.create_engine(*args, **kwargs)函数可被用于创建数据库引擎,数据库位置可用本地路径,也可用网络URL。
from sqlalchemy import *
import pandas as pd
# 定义元信息,绑定到引擎,test.db为数据库名,./表示当前路径。
engine = create_engine('sqlite:////images/ch6/6.8 test.db', echo=True)
metadata = MetaData(engine) # 绑定元信息
Pandas中的read_sql()方法可以查询数据库中的数据并直接返回DateFrame,在方法的参数中可以传入SQL语句。read_sql()方法的主要参数及意义如下:
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
- sql : 表名或查询语句
- con : 连接数据库的引擎,一般可以用SQLAlchemy之类的模块创建
- columns : 需要从表中查询的列名的列表
实例 6.8 读取SQLite数据库中的数据¶
SQLite数据库中文件“6.8 test.db”的score表中存储了学生的成绩数据,请将数据库中的数据读入到列表中。
from sqlalchemy import *
import pandas as pd
# 定义引擎,6.8 test.db为数据库名,./表示当前路径
engine = create_engine('sqlite:////images/ch6/6.8 test.db') # , echo=True)
score_df = pd.read_sql('score', engine) # 从score表读数据dataframe
print(score_df) # 查看输出dataframe格式数据
姓名 C语言 Java Python C# C++
0 罗明 95 96 85 63 91
1 朱佳 75 93 66 85 88
2 李思 86 76 96 93 67
3 郑君 88 98 76 90 89
4 王雪 99 96 91 88 86
from sqlalchemy import *
import pandas as pd
# 定义引擎,6.8 test.db为数据库名,./表示当前路径
engine = create_engine('images/ch6/6.8 test.db') # , echo=True)
score_df = pd.read_sql('score', engine) # 从score表读数据dataframe
title = score_df.columns.tolist() # dataframe数据转为列表类型
score_ls = score_df.values.tolist() # dataframe数据转为列表类型
print('输出列表类型的数据:\n', [title] + score_ls) # 输出转为列表的数据
```python
[['姓名', 'C语言', 'Java', 'Python', 'C#', 'C++'],
['罗明', 95, 96, 85, 63, 91],
['朱佳', 75, 93, 66, 85, 88],
['李思', 86, 76, 96, 93, 67],
['郑君', 88, 98, 76, 90, 89],
['王雪', 99, 96, 91, 88, 86]]
```
pip install sqlalchemy
类似的方法,也可以从json格式的文件中读取数据到列表:
import pandas as pd
score_df = pd.read_json('images/ch6/6.8 scoreTest.json', encoding='utf-8')
title = score_df.columns.tolist() # dataframe数据转为列表类型
score_ls = score_df.values.tolist() # dataframe数据转为列表类型
print('输出列表类型的数据:\n', [title] + score_ls) # 输出转为列表的数据
pandas 数据显示¶
若csv文件的某列中有逗号,一般会将该列数据放到一对比引号中。pandas读csv文件时,可以将引号中的数据自动处理为一个元素,用pandas处理此类数据,可以避免用切分方法导致的误切分。
import pandas as pd
wine_reviews = pd.read_csv("images/ch6/winemag-data.csv")
print(wine_reviews.shape) # ((12973, 6)
pd.set_option('display.max_columns', None) # 显示所有列
pd.set_option('display.max_rows', None) # 显示所有行
pd.set_option('display.width', None) # 显示宽度是无限
print(wine_reviews.head()) # 返回数据的前5行