Pandas读取保存数据
学习目标
- 能够使用Pandas读写文件中的数据
- 知道Pandas读取数据时常用参数index_col、parse_dates、sheet_name、index的作用和用法
- 知道Pandas和MySQL数据库进行读写交互的方法
1 读写文件
常用读写文件函数清单【查表】无需记忆
文件格式 读取函数 写入函数 xlsx pd.read_excel df.to_excel xls pd.read_excel df.to_excel csv pd.read_csv df.to_csv tsv pd.read_csv df.to_csv json pd.read_json df.to_json html pd.read_html df.to_html sql pd.read_sql df.to_sql
1.1 Excel文件
-
保存数据
import pandas as pd data = [ [1, '张三', '1999-3-10', 18], [2, '李四', '2002-3-10', 15], [3, '王五', '1990-3-10', 33], [4, '隔壁老王', '1983-3-10', 40] ] # 创建df对象 df = pd.DataFrame(data=data, columns=['id', 'name', 'birthday', 'age']) # 保存数据 # sheet_name:表名 # index:是否保存df行索引值 # header:是否保存df列名 df.to_excel('./output/student.xls', sheet_name='student', index=False, header=True)
-
读取数据
student = pd.read_excel('./output/student.xls') print(student)
1.2 CSV文件
- 在CSV文件中,对于每一行,各列采用逗号
,
分隔;使用\n
换行符换行- 除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符
\t
作为分隔符- CSV是数据协作和共享的首选格式,因为可以使用excel工具打开
-
保存数据
# 默认保存行索引, 默认使用逗号作为分隔符 df.to_csv('./output/student.csv') # index=False:不保存行索引 df.to_csv('./output/student_noindex.csv', index=False) # sep='\t': 使用\t作为分隔符, 保存成tsv文件, 文件后缀为.tsv df.to_csv('./output/student.tsv', sep='\t')
-
读取数据
# 读取csv文件 # index_col:通过列下标或列名指定某列为索引 # parse_dates: 将指定列解析为日期时间类型, 通过列下标或列名指定列 student = pd.read_csv('./output/student.csv', index_col=['Unnamed: 0'], parse_dates=['birthday']) print(student) student.info() # 读取tsv文件 # sep:指定分隔符 # parse_dates=True:将df的索引解析为日期时间类型 student = pd.read_csv('./output/student.tsv', sep='\t', index_col=[3], parse_dates=True) print(student) print(student.index) # 输出结果如下 id name birthday age 0 1 张三 1999-03-10 18 1 2 李四 2002-03-10 15 2 3 王五 1990-03-10 33 3 4 隔壁老王 1983-03-10 40 <class 'pandas.core.frame.DataFrame'> Int64Index: 4 entries, 0 to 3 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 4 non-null int64 1 name 4 non-null object 2 birthday 4 non-null datetime64[ns] 3 age 4 non-null int64 dtypes: datetime64[ns](1), int64(2), object(1) memory usage: 160.0+ bytes Unnamed: 0 id name age birthday 1999-03-10 0 1 张三 18 2002-03-10 1 2 李四 15 1990-03-10 2 3 王五 33 1983-03-10 3 4 隔壁老王 40 DatetimeIndex(['1999-03-10', '2002-03-10', '1990-03-10', '1983-03-10'], dtype='datetime64[ns]', name='birthday', freq=None)
2 读写数据库
如果想利用pandas和MySQL数据库进行交互,需要先安装与数据库交互所需要的pymysql和sqlalchemy python包
虚拟机的python解析器已经安装好这两个包,无需重复安装
pip install pymysql
pip install sqlalchemy
2.1 保存数据
-
准备要写入数据库的数据
import pandas as pd df = pd.read_csv('./output/student.csv', index_col=[0]) print(df) # 输出结果如下 id name birthday age 0 1 张三 1999-3-10 18 1 2 李四 2002-3-10 15 2 3 王五 1990-3-10 33 3 4 隔壁老王 1983-3-10 40
-
创建数据库操作引擎对象并指定数据库
# 导入sqlalchemy的数据库引擎 from sqlalchemy import create_engine # 创建数据库引擎,传入url规则的字符串 engine = create_engine('mysql+pymysql://root:[email protected]:3306/test?charset=utf8') # mysql+pymysql://root:[email protected]:3306/test?charset=utf8 # mysql 表示数据库类型 # pymysql 表示python操作数据库的包 # root:123456 表示数据库的账号和密码,用冒号连接 # 192.168.88.100:3306/test 表示数据库的ip和端口,以及名叫test的数据库 # charset=utf8 规定编码格式
-
将数据写入MySQL数据库
# df.to_sql()方法将df数据快速写入数据库, 表不存在时会自动创建 df.to_sql(name='student', con=engine, index=False, if_exists='append') # name:数据表的名称 # con:数据库交互引擎对象 # index=False: 表示不将索引保存到数据表中 # if_exists: 数据写入方式, append->追加写入 replace->覆盖写入
2.2 读取数据
-
指定表名, 指定列名
# sql:读取的表名 # con:数据库交互引擎对象 # columns:读取的列名 student = pd.read_sql(sql='student', con=engine, columns=['id', 'name']) print(student) # pd.read_sql_table('student', con=engine, columns=['id', 'name'])
-
使用SQL语句获取数据
# sql:传入sql语句 # con:数据库交互引擎对象 student = pd.read_sql(sql='select * from student where age > 20', con=engine) print(student) # pd.read_sql_query(sql='select * from student where age > 20', con=engine)
总结
-
写文件方法
df.to_csv/excel('xxx.csv/xls')
-
pd.read_csv/excel()
读取文件,常用参数如下index_col
指定索引列index_col = [1]
列下标指定为索引index_col = ['col_name']
列名指定为索引
parse_dates
对指定列解析为时间日期类型- 将指定的列解析为时间日期类型
parse_dates=[1]
通过列下标解析该列为时间日期类型parse_dates=['col_name']
通过列名解析该列为时间日期类型
parse_dates=True
将df的索引解析为时间日期类型
- 将指定的列解析为时间日期类型
pd.read_csv('xxx.tsv', sep='\t')
指定字符分隔符为\t
读取tsv文件
-
Pandas和MySQL进行交互(读写)
# 需要安装 pip istall pymysql # 需要安装 pip istall sqlalchemy # 导入sqlalchemy的数据库引擎 from sqlalchemy import create_engine # 创建数据库引擎,传入url规则的字符串 engine = create_engine('mysql+pymysql://root:[email protected]:3306/test?charset=utf8') # mysql+pymysql://root:[email protected]:3306/test?charset=utf8 # mysql 表示数据库类型 # pymysql 表示python操作数据库的包 # root:123456 表示数据库的账号和密码,用冒号连接 # 192.168.88.100:3306/test 表示数据库的ip和端口,以及名叫test的数据库 # charset=utf8 规定编码格式 # df.to_sql()方法将df数据快速写入数据库, 表不存在时会自动创建 df.to_sql(name='student', con=engine, index=False, if_exists='append') # name:数据表的名称 # con:数据库交互引擎对象 # index=False: 表示不将索引保存到数据表中 # if_exists: 数据写入方式, append->追加写入 replace->覆盖写入 # sql:读取的表名 # con:数据库交互引擎对象 # columns:读取的列名 student = pd.read_sql(sql='student', con=engine, columns=['id', 'name']) print(student) # pd.read_sql_table('student', con=engine, columns=['id', 'name']) # sql:传入sql语句 # con:数据库交互引擎对象 student = pd.read_sql(sql='select * from student where age > 20', con=engine) print(student) # pd.read_sql_query(sql='select * from student where age > 20', con=engine)