03_Pandas 读写数据
学习目标
-
能够使用Pandas读写文件中的数据
-
知道Pandas读取数据时常用参数index_col、parse_dates、sheet_name、index的作用和用法
-
知道Pandas和MySQL数据库进行读写交互的方法
-
读写文件
常用读写文件函数清单【查表】无需记忆
文件格式 | 读取函数 | 写入函数 |
xlsx | df = 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 |
-
Excel文件
-
写
-
写_API
-
df.to_excel是pandas库中用于将DataFrame对象保存为 Excel 文件的方法。
-
主要参数及用法:
-
excel_writer:指定要写入的 Excel 文件路径或ExcelWriter对象。例如:'output.xlsx'。
-
sheet_name:指定要写入的工作表名称。默认值为'Sheet1'。例如:sheet_name='MyData'。
-
index:布尔值,决定是否写入行索引。默认值为True,表示写入行索引。例如:index=False则不写入行索引。
-
columns:可选择要写入的列,可以是列名列表。默认值为写入所有列。例如:columns=['col1', 'col2']只写入指定的两列。
-
-
示例用法:
import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6]} df = pd.DataFrame(data) df.to_excel('output.xlsx', sheet_name='DataSheet', index=False)
-
这段代码将创建一个包含两列数据的DataFrame,并将其保存为名为output.xlsx的 Excel 文件中的DataSheet工作表,且不写入行索引。
-
-
路径
准备数据(字典) data = [ [1, '张三', '1999-3-10', 18], [2, '李四', '2002-3-10', 15], [3, '王五', '1990-3-10', 33], [4, '隔壁老王', '1983-3-10', 40] ] df = pd.DataFrame(data, columns=['id', 'name', 'birthday', 'age']) df 写(默认) 写 (去掉索引) 写 (去掉索引, 去掉标题) 写 (去掉索引, 去掉标题, 指定sheet名称)
-
实现
-
准备数据(字典)
data = [ [1, '张三', '1999-3-10', 18], [2, '李四', '2002-3-10', 15], [3, '王五', '1990-3-10', 33], [4, '隔壁老王', '1983-3-10', 40] ] df = pd.DataFrame(data, columns=['id', 'name', 'birthday', 'age']) df
-
写(默认)
df.to_excel('./output/student.xls')
-
写 (去掉索引)
df.to_excel('./output/student_2.xls', index=False)
-
写 (去掉索引, 去掉标题)
df.to_excel('./output/student_3.xls', index=False, header=False)
-
写 (去掉索引, 去掉标题, 指定sheet名称)
df.to_excel('./output/student_4.xls', index=False, header=False, sheet_name='学生信息')
-
读
-
读_API
-
pd.read_excel是pandas库中用于读取 Excel 文件的函数。
-
主要参数及用法:
-
io:指定要读取的 Excel 文件的路径,可以是本地文件路径或一个有效的文件对象。例如:'./data.xlsx'。
-
sheet_name:指定要读取的工作表名称或索引。可以是字符串(工作表名称)、整数(工作表索引)或一个列表(读取多个工作表)。默认值为 0,表示读取第一个工作表。例如:sheet_name='Sheet1'或sheet_name=1。
-
header:指定用作列名的行号。可以是整数、整数列表或None。如果是整数,该行为列名;如果是列表,多个行被组合成一个层次化索引;如果是None,则不使用任何行作为列名,列名将是从 0 开始的整数。默认值为 0,表示第一行为列名。例如:header=1表示将第二行作为列名。
-
index_col:指定用作行索引的列号或列名。可以是整数、整数列表或None。如果是整数,该列为行索引;如果是列表,多个列被组合成一个层次化索引;如果是None,则不使用任何列作为行索引,行索引将是从 0 开始的整数。默认值为None。例如:index_col=0表示将第一列作为行索引。
-
usecols:指定要读取的列。可以是列名列表、整数列表或一个可调用对象,用于筛选列。例如:usecols=[0, 2]表示读取第一列和第三列。
-
skiprows:指定要跳过的行数。可以是整数、整数列表或可调用对象。例如:skiprows=2表示跳过前两行。
-
nrows:指定要读取的行数。例如:nrows=100表示读取前 100 行数据。
-
-
返回值:
-
该函数返回一个pandas的DataFrame对象,包含从 Excel 文件中读取的数据。
-
-
示例用法:
import pandas as pd df = pd.read_excel('data.xlsx', sheet_name='Sheet1', header=0, index_col=0) print(df)
-
这个示例代码读取名为data.xlsx文件中的Sheet1工作表,将第一行作为列名,第一列作为行索引,并打印出读取的数据框。
-
-
路径
# 1 读(默认) # 2 读 指定索引列 # 3 读 碰到无标题列 无索引列 怎么办? 指定索引列, 标题列 # 4 读 只要 1 2 3 列 # 5 读 只要前两行数据 # 6 读 跳过前两行
-
实现
-
1 读(默认)
df = pd.read_excel('./output/student.xls') df
-
2 读 指定索引列
pd.read_excel('./output/student.xls', index_col=0)
-
3 读 碰到无标题列 无索引列 怎么办? 指定索引列, 标题列
print(pd.read_excel('./output/student_3.xls', index_col=0)) print('------------------------') pd.read_excel('./output/student_3.xls', index_col=None, header=None)
-
4 读 只要 1 2 3 列
pd.read_excel('./output/student.xls', index_col=0, usecols=[1,2,3]) pd.read_excel('./output/student.xls', index_col=0, usecols=["id", "name", "birthday"])
-
5 读 只要前两行数据
pd.read_excel('./output/student.xls', index_col=0, usecols=[1,2,3], nrows=2)
-
6 读 跳过前两行
pd.read_excel('./output/student.xls', index_col=0, usecols=[1,2,3], skiprows=2)
-
CSV文件
-
在CSV文件中,对于每一行,各列采用逗号
,
分隔;使用\n
换行符换行 -
除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符
\t
作为分隔符 -
CSV是数据协作和共享的首选格式,因为可以使用excel工具打开
-
写
-
写_API
-
df.to_csv是pandas库中用于将DataFrame对象保存为 CSV(逗号分隔值)文件的方法。
-
主要参数及用法:
-
path_or_buf:指定要写入的 CSV 文件路径或文件对象。例如:'output.csv'。
-
sep:指定分隔符,默认为,。例如:sep=';'可以使用分号作为分隔符。
-
index:布尔值,决定是否写入行索引。默认值为True,表示写入行索引。例如:index=False则不写入行索引。
-
header:布尔值或字符串列表,决定是否写入列名。默认值为True,表示写入列名。如果设置为False,则不写入列名。也可以传入一个列名列表来指定特定的列名写入。例如:header=['Col1', 'Col2']。
-
encoding:指定文件编码方式。常见的编码有utf-8等。例如:encoding='utf-8-sig'。
-
mode:指定文件打开模式,默认为'w'(写入模式)。如果要追加数据,可以使用'a'。
-
-
示例用法:
import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6]} df = pd.DataFrame(data) df.to_csv('output.csv', index=False, sep='|')
-
这段代码将创建一个包含两列数据的DataFrame,并将其保存为名为output.csv的 CSV 文件,使用竖线|作为分隔符且不写入行索引。
-
-
路径
import pandas as pd # 1 将数据写入 csv 中 # 1.1 准备数据(字典) data = [ [1, '张三', '1999-3-10', 18], [2, '李四', '2002-3-10', 15], [3, '王五', '1990-3-10', 33], [4, '隔壁老王', '1983-3-10', 40] ] df = pd.DataFrame(data, columns=['id', 'name', 'birthday', 'age']) df # 1 写(默认) # 2 写 去掉索引 # 2 写 保留索引 # 3 写 去掉索引 去掉标题 # 4 写 去掉索引 去掉标题 只要 id列和 name列 # 5 写 去掉索引 去掉标题 更换分隔符 # 6 写 追加效果 默认是覆写
-
实现
import pandas as pd # 1 将数据写入 csv 中 # 1.1 准备数据(字典) data = [ [1, '张三', '1999-3-10', 18], [2, '李四', '2002-3-10', 15], [3, '王五', '1990-3-10', 33], [4, '隔壁老王', '1983-3-10', 40] ] df = pd.DataFrame(data, columns=['id', 'name', 'birthday', 'age']) df # 1 写(默认) df.to_csv('./output/student.csv') # 2 写 去掉索引 df.to_csv('./output/student_2.csv', index=False) # 2 写 保留索引 df.to_csv('./output/student_2_2.csv', index=True) # 3 写 去掉索引 去掉标题 df.to_csv('./output/student_3.csv', index=False, header=False) # 4 写 去掉索引 去掉标题 只要 id列和 name列 df.to_csv('./output/student_4.csv', index=False, header=False, columns=["id", "name"]) # 5 写 去掉索引 去掉标题 更换分隔符 df.to_csv('./output/student_5.csv', index=False, header=False, sep=';') # 6 写 追加效果 默认是覆写 df.to_csv('./output/student_5.csv', index=False, header=False, sep=';', mode='a')
-
读
-
写_API
-
pd.read_csv是pandas库中用于读取 CSV(逗号分隔值)文件的函数。
-
主要参数及用法:
-
filepath_or_buffer:指定要读取的 CSV 文件的路径或文件对象。例如:'data.csv'。
-
sep:指定分隔符,默认为,。如果 CSV 文件使用其他分隔符,如制表符\t或分号;,可以通过这个参数指定。例如:sep=';'。
-
header:指定用作列名的行号。可以是整数、整数列表或None。如果是整数,该行为列名;如果是列表,多个行被组合成一个层次化索引;如果是None,则不使用任何行作为列名,列名将是从 0 开始的整数。默认值为 0,表示第一行为列名。例如:header=None表示不将任何行作为列名,列名将自动编号。
-
names:如果header=None,可以使用这个参数指定列名列表。例如:names=['col1', 'col2', 'col3']。
-
index_col:指定用作行索引的列号或列名。可以是整数、整数列表或None。如果是整数,该列为行索引;如果是列表,多个列被组合成一个层次化索引;如果是None,则不使用任何列作为行索引,行索引将是从 0 开始的整数。默认值为None。例如:index_col=0表示将第一列作为行索引。
-
usecols:指定要读取的列。可以是列名列表、整数列表或一个可调用对象,用于筛选列。例如:usecols=[0, 2]表示读取第一列和第三列。
-
skiprows:指定要跳过的行数。可以是整数、整数列表或可调用对象。例如:skiprows=2表示跳过前两行。
-
nrows:指定要读取的行数。例如:nrows=100表示读取前 100 行数据。
-
encoding:指定文件的编码方式。常见的编码有utf-8等。例如:encoding='utf-8-sig'。
-
-
返回值:
-
该函数返回一个pandas的DataFrame对象,包含从 CSV 文件中读取的数据。
-
-
示例用法:
import pandas as pd # 读取 CSV 文件,使用分号作为分隔符,第一行为列名,将第三列作为行索引 df = pd.read_csv('data.csv', sep=';', header=0, index_col=2) print(df)
-
这个示例代码读取名为data.csv的文件,使用分号作为分隔符,将第一行作为列名,并将第三列作为行索引,然后打印出读取的数据框。
-
-
路径
# 1 读(无索引列的文件) # 2 读(有索引列的文件) # 3 读 指定索引列 # 4 读 指定索引列, 将 birthday 解析成 日期类型 # 5 读 指定索引列, 指定非默认分隔符
-
实现
# 1 读(无索引列的文件) df = pd.read_csv('./output/student.csv') df # 2 读(有索引列的文件) df = pd.read_csv('./output/student_2_2.csv') df # 3 读 指定索引列 df = pd.read_csv('./output/student_2_2.csv', index_col=0) print(df) print('---------------------------') print(df.info()) # 4 读 指定索引列, 将 birthday 解析成 日期类型 df = pd.read_csv('./output/student_2_2.csv', index_col=0, parse_dates=['birthday']) print(df) print('---------------------------') print(df.info()) # 5 读 指定索引列, 指定非默认分隔符 df = pd.read_csv('./output/student_5.csv', index_col=0, header=None, sep=';') df
-
读写数据库
准备工作
如果想利用pandas和MySQL数据库进行交互,需要先安装与数据库交互所需要的 pymysql和 sqlalchemy python包
虚拟机的python解析器已经安装好这两个包,无需重复安装
pip install pymysql
pip install sqlalchemy
-
Mysql 写
-
写 API
-
创建数据库操作引擎对象并指定数据库
# 导入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 规定编码格式
-
将数据写入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->覆盖写入
-
路径
# 1 加载数据 import pandas as pd df = pd.read_csv('./output/student.csv', index_col=[0]) df # 创建连接 mysql+pymysql://username:password@host:port/database_name # 写
-
实现
# 1 加载数据 import pandas as pd df = pd.read_csv('./output/student.csv', index_col=[0]) df # 创建连接 mysql+pymysql://username:password@host:port/database_name from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:123456@192.168.88.100/test?charset=utf8') # 写 df.to_sql('student', con=engine, if_exists='append')
-
Mysql 读
-
读 API
-
pd.read_sql是pandas库中用于从数据库中读取数据并转换为DataFrame对象的函数。
-
主要参数及用法:
-
sql:要执行的 SQL 查询语句或表名。如果是表名,函数将尝试从数据库中读取整个表的数据。例如:'SELECT * FROM my_table'或者'my_table'。
-
con:数据库连接对象。这通常是使用sqlalchemy创建的连接引擎,与df.to_sql中的con参数类似。例如:如果是连接到 MySQL 数据库,可以使用create_engine('mysql+pymysql://username:password@host:port/database_name')创建连接引擎并传入这里。
-
index_col:指定用作DataFrame行索引的列名或列号。可以是单个列名 / 列号,也可以是一个列表,表示多个列组成的复合索引。例如:index_col='id'表示将数据库表中的id列作为DataFrame的行索引。
-
columns:指定要读取的列名列表。如果只想读取数据库表中的部分列,可以通过这个参数指定。例如:columns=['col1', 'col2']。
-
-
返回值:
-
该函数返回一个pandas的DataFrame对象,包含从数据库中读取的数据。
-
-
示例用法:
import pandas as pd from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://username:password@host:port/database_name') # 读取整个表数据并将表中的 id 列作为 DataFrame 的行索引 df = pd.read_sql('my_table', con=engine, index_col=['id']) print(df)
-
假设我们有一个 MySQL 数据库,想要读取其中一个表的数据:
-
在这个例子中,我们使用sqlalchemy创建了一个连接到 MySQL 数据库的引擎,并使用pd.read_sql读取了名为my_table的表数据,将表中的id列作为DataFrame的行索引,然后打印出读取的数据框。
-
-
路径
# 1 通过表读 # 2 通过 sql 读取
-
实现
-
指定表名, 指定列名
# 1 通过表读 df = pd.read("student", con=engine, columns=["id", "name"]) print(df) # df = pd.read_table("student", con=engine, columns=["id", "name"]) # print(df)
-
使用SQL语句获取数据
# 2 通过 sql 读取 df = pd.read("select * from student where id>2", con=engine) df # df = pd.read_sql("select * from student where id>2", con=engine) # df
总结
请对下面的内容 有印象、能找到、能理解、能看懂
-
写文件方法
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)