学习目标
-
能够使用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 \t分割 pd.read_csv df.to_csv json pd.read_json to_json html pd.read_html df.to_html sql pd.read_sql df.to_sql
1.1 Excel文件
保存数据:
import pandas as pd
# 1、定义一个列表嵌套的数据,作为DataFrame表格数据
list_data = [
[1, '张三', '1999-3-10', 18],
[2, '李四', '2002-3-10', 15],
[3, '王五', '1990-3-10', 33],
[4, '隔壁老王', '1983-3-10', 40]
]
# 2、将以上的列表数据转为DataFrame
df = pd.DataFrame(data=list_data, columns=['id', 'name', 'birthday', 'age'])
# 3、保存数据到excel
# sheet_name:表名
# index:是否保存df行索引值
# header:是否保存df列名
#sep= 可以指定分隔符
df.to_excel('test1.xls', sheet_name='student', index=False, header=True)
df.to_excel('test2.xlsx',sheet_name='student',index=True,header=True)
读取数据
# 4、读取Excel数据
student1 = pd.read_excel('test1.xlsx')
print(student1)
print('------------------------')
#index_col:读取excel文件时,将excel中原来的行索引继续当成行索引,默认读取的列名是:Unnamed: 0
#index_col:如果不指定行索引,则又会在df前边加新的行索引
student2= pd.read_excel('test2.xlsx',index_col='Unnamed: 0')
print(student2)
1.2 CSV文件
在CSV文件中,对于每一行,各列采用逗号
,
分隔;使用\n
换行符换行除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符
\t
作为分隔符CSV是数据协作和共享的首选格式,因为可以使用excel工具打开
-
保存数据
import pandas as pd
# 1、定义一个列表嵌套的数据,作为DataFrame表格数据
data = [
[1, '张三', '1999-3-10', 18],
[2, '李四', '2002-3-10', 15],
[3, '王五', '1990-3-10', 33],
[4, '老王', '1983-3-10', 40]
]
# 2、将以上的列表数据转为DataFrame
df = pd.DataFrame(data=data, columns=['id', 'name', 'birthday', 'age'])
print(df)
# 3、将df写入csv文件,使用默认分隔符逗号
# 写行索引,写表头(列名)
df.to_csv('test1.csv', index=True,header=True)
# 不行索引,写表头(列名)
df.to_csv('test2.csv', index=False,header=True)
# 4、将df写入csv文件,使用指定分隔符
df.to_csv('test3.csv', index=False,header=True,sep='#')
# 5、将df写入tsv文件,使用指定分隔符为\t
df.to_csv('test4.tsv', index=False,header=True,sep='\t')
读取数据
# 读取csv文件
# index_col:通过列下标或列名指定某列为索引
# parse_dates: 将指定列解析为日期时间类型, 通过列下标或列名指定列
df2 = pd.read_csv('test1.csv', index_col=['Unnamed: 0'], parse_dates=['birthday'])
print(df2)
stdf2.info()
# 读取csv文件,如果文件的分隔符不是逗号,则需要用参数sep执行你文件的分隔符
df2 = pd.read_csv('test3.csv',sep='#')
print(df2)
# 输出结果如下
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
# 1、定义一个列表嵌套的数据,作为DataFrame表格数据
data = [
[1, '张三', '1999-3-10', 18],
[2, '李四', '2002-3-10', 15],
[3, '王五', '1990-3-10', 33],
[4, '老王', '1983-3-10', 40]
]
# 2、将以上的列表数据转为DataFrame
df = pd.DataFrame(data=data, columns=['id', 'name', 'birthday', 'age'])
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规则的字符串,test数据库必须存在,否则报错
engine = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8')
# mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8
# mysql 表示数据库类型
# pymysql 表示python操作数据库的包
# root:123456 表示数据库的账号和密码,用冒号连接
# 192.168.88.100:3306/test 表示数据库的ip和端口,以及名叫test的数据库
# charset=utf8 规定编码格式
将数据写入MySQL数据库
# 导入sqlalchemy的数据库引擎
from sqlalchemy import create_engine
# 创建数据库引擎,传入url规则的字符串,test数据库必须存在,否则报错
engine = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8')
# mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8
# mysql 表示数据库类型
# pymysql 表示python操作数据库的包
# root:123456 表示数据库的账号和密码,用冒号连接
# 192.168.88.100:3306/test 表示数据库的ip和端口,以及名叫test的数据库
# charset=utf8 规定编码格式
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 name,age from student where age > 20', con=engine) print(student) pd.read_sql_query(sql='select name,age from student where age > 20', con=engine) print(student)
总结
请对下面的内容 有印象、能找到、能理解、能看懂
-
写文件方法
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:123456@192.168.88.100:3306/test?charset=utf8')
# mysql+pymysql://root:123456@192.168.88.100: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)