20个经典函数细说 Pandas 中的数据读取与存储,强烈建议收藏
扫描二维码
随时随地手机看文章
我们大致会说到的方法有:
-
read_sql()
-
to_sql()
-
read_clipboard()
-
from_dict()
-
to_dict()
-
to_clipboard()
-
read_json()
-
to_json()
-
read_html()
-
to_html()
-
read_table()
-
read_csv()
-
to_csv()
-
read_excel()
-
to_excel()
-
read_xml()
-
to_xml()
-
read_pickle()
-
to_pickle()
read_sql()与
to_sql()
我们一般读取数据都是从数据库中来读取的,因此可以在read_sql()方法中填入对应的
sql语句然后来读取我们想要的数据,
pd.read_sql(sql, con, index_col=None,coerce_float=True, params=None,
parse_dates=None,
columns=None, chunksize=None)
- sql: SQL命令字符串
- con: 连接SQL数据库的Engine,一般用SQLAlchemy或者是PyMysql之类的模块来建立
- index_col:选择某一列作为Index
- coerce_float:将数字形式的字符串直接以float型读入
- parse_dates: 将某一列日期型字符串传唤为datatime型数据,可以直接提供需要转换的列名以默认的日期形式转换,或者也可以提供字典形式的列名和转换日期的格式,
PyMysql这个模块来连接数据库,并且读取数据库当中的数据,首先我们导入所需要的模块,并且建立起与数据库的连接
import pandas as pdfrom pymysql import *
conn = connect(host='localhost', port=3306, database='database_name',
user='', password='', charset='utf8')
SQL命令来读取数据库当中的数据,并且用read_sql()方法来读取数据
sql_cmd = "SELECT * FROM table_name"df = pd.read_sql(sql_cmd, conn)
df.head()
read_sql()方法当中
parse_dates参数可以对日期格式的数据进行处理,那我们来试一下其作用
sql_cmd_2 = "SELECT * FROM test_date"df_1 = pd.read_sql(sql_cmd_2, conn)
df_1.head()
0 1 2021-11-11
1 2 2021-10-01
2 3 2021-11-10
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 number 3 non-null int64
1 date_columns 3 non-null object
dtypes: int64(1), object(1)
memory usage: 176.0 bytes
date_columns这一列也是被当做是
String类型的数据,要是我们通过
parse_dates参数将日期解析应用与该列
df_2 = pd.read_sql(sql_cmd_2, conn, parse_dates="date_columns")df_2.info()
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 number 3 non-null int64
1 date_columns 3 non-null datetime64[ns]
dtypes: datetime64[ns](1), int64(1)
memory usage: 176.0 bytes
to_sql()方法
我们来看一下to_sql()方法,作用是将
DataFrame当中的数据存放到数据库当中,请看下面的示例代码,我们创建一个基于内存的
SQLite数据库
from sqlalchemy import create_engineengine = create_engine('sqlite://', echo=False)
df.to_sql('nums', con=engine)
df2.to_sql('nums', con=engine, if_exists='append')
engine.execute("SELECT * FROM nums").fetchall()
if_exists参数上面填的是
append,意味着添加新数据进去,当然我们也可以将原有的数据替换掉,将
append替换成
replace
df2.to_sql('nums', con=engine, if_exists='replace')engine.execute("SELECT * FROM nums").fetchall()
from_dict()方法和
to_dict()方法
有时候我们的数据是以字典的形式存储的,有对应的键值对,我们如何根据字典当中的数据来创立DataFrame,假设
a_dict = {'学校': '清华大学',
'地理位置': '北京',
'排名': 1
}
json_normalize()方法,代码如下
df = pd.json_normalize(a_dict)
0 清华大学 北京 1
pd.DataFrame()方法也是可以的
df = pd.DataFrame(json_list, index = [0])
0 清华大学 北京 1
from_dict()方法,代码如下
df = pd.DataFrame.from_dict(a_dict,orient='index').T
0 清华大学 北京 1
orient参数,用来指定字典当中的键是用来做行索引还是列索引,请看下面两个例子
data = {'col_1': [1, 2, 3, 4],'col_2': ['A', 'B', 'C', 'D']}
orient参数设置为
columns,将当中的键当做是列名
df = pd.DataFrame.from_dict(data, orient='columns')
0 1 A
1 2 B
2 3 C
3 4 D
orient设置为是
index
df = pd.DataFrame.from_dict(data, orient='index')
col_1 1 2 3 4
col_2 A B C D
to_dict()方法
语法如下:
orient参数,一般可以填这几种形式
一种是默认的dict,代码如下
df = pd.DataFrame({'shape': ['square', 'circle', 'triangle'],'degrees': [360, 360, 180],
'sides': [4, 5, 3]})
df.to_dict(orient='dict')
list,代码如下
df.to_dict(orient='list')
split,代码如下
df.to_dict(orient='split')
records,代码如下
df.to_dict(orient='records')
index,代码如下
df.to_dict(orient='index')
read_json()方法和
to_json()方法
我们经常也会在实际工作与学习当中遇到需要去处理JSON格式数据的情况,我们用
Pandas模块当中的
read_json()方法来进行处理,我们来看一下该方法中常用到的参数
orient:对应JSON字符串的格式主要有
-
split: 格式类似于:
{index: [index], columns: [columns], data: [values]}
df = pd.read_json(a, orient='split')
1 1 3
2 2 8
3 3 9
-
records: 格式类似于:
[{column: value}, ... , {column: value}]
df_1 = pd.read_json(a, orient='records')
0 Tom 18
1 Amy 20
2 John 17
-
index: 格式类似于:
{index: {column: value}}
df_1 = pd.read_json(a, orient='index')
index_1 John 20
index_2 Tom 30
index_3 Jason 50
-
columns: 格式类似于:
{column: {index: value}}
index变成
columns,就变成
df_1 = pd.read_json(a, orient='columns')
name John Tom Jason
age 20 30 50
-
values: 数组
df_1 = pd.read_json(v, orient="values")
0 a 1
1 b 2
2 c 3
to_json()方法
将DataFrame数据对象输出成
JSON字符串,可以使用
to_json()方法来实现,其中
orient参数可以输出不同格式的字符串,用法和上面的大致相同,这里就不做过多的赘述
read_html()方法和
to_html()方法
有时候我们需要抓取网页上面的一个表格信息,相比较使用Xpath或者是
Beautifulsoup,我们可以使用
pandas当中已经封装好的函数
read_html来快速地进行获取,例如我们通过它来抓取菜鸟教程Python网站上面的一部分内容
url = "https://www.runoob.com/python/python-exceptions.html"dfs = pd.read_html(url, header=None, encoding='utf-8')
list的
DataFrame对象
df = dfs[0]df.head()
0 NaN NaN
1 BaseException 所有异常的基类
2 SystemExit 解释器请求退出
3 KeyboardInterrupt 用户中断执行(通常是输入^C)
4 Exception 常规错误的基类
read_html()方法也支持读取
HTML形式的表格,我们先来生成一个类似这样的表格,通过
to_html()方法
df = pd.DataFrame(np.random.randn(3, 3))df.to_html("test_1.html")
HTML形式的表格长这个样子
read_html方法读取该文件,
dfs = pd.read_html("test_1.html")dfs[0]
read_csv()方法和
to_csv()方法
read_csv()方法
read_csv()方法是最常被用到的
pandas读取数据的方法之一,其中我们经常用到的参数有
- filepath_or_buffer: 数据输入的路径,可以是文件的路径的形式,例如
0 1 2 3 4
1 6 12 7 9
2 11 13 15 18
3 12 10 16 18
-
sep: 读取
csv文件时指定的分隔符,默认为逗号,需要注意的是:“csv文件的分隔符”要和“我们读取csv文件时指定的分隔符”保持一致
csv文件当中的分隔符从逗号改成了"\t",需要将
sep参数也做相应的设定
pd.read_csv('data.csv', sep='\t')
-
index_col: 我们在读取文件之后,可以指定某一列作为
DataFrame的索引
num1
1 2 3 4
6 12 7 9
11 13 15 18
12 10 16 18
num1 num2
1 2 3 4
6 12 7 9
11 13 15 18
12 10 16 18
- usecols:如果数据集当中的列很多,而我们并不想要全部的列、而是只要指定的列就可以,就可以使用这个参数
0 1 2
1 6 12
2 11 13
3 12 10
0 1 2 3
1 6 12 7
2 11 13 15
3 12 10 16
pd.read_csv('girl.csv', usecols=lambda x: len(x) > 4)
- prefix: 当导入的数据没有header的时候,可以用来给列名添加前缀
0 num1 num2 num3 num4
1 1 2 3 4
2 6 12 7 9
3 11 13 15 18
4 12 10 16 18
header设为None,
pandas则会自动生成表头0, 1, 2, 3..., 然后我们设置
prefix参数为表头添加前缀
df = pd.read_csv("data.csv", prefix="test_", header = None)
0 num1 num2 num3 num4
1 1 2 3 4
2 6 12 7 9
3 11 13 15 18
4 12 10 16 18
- skiprows: 过滤掉哪些行,参数当中填行的索引
0 11 13 15 18
1 12 10 16 18
- nrows: 该参数设置一次性读入的文件行数,对于读取大文件时非常有用,比如 16G 内存的PC无法容纳几百G的大文件
0 1 2 3 4
1 6 12 7 9
to_csv()方法
该方法主要是用于将DataFrame写入
csv文件当中,示例代码如下
df.to_csv("文件名.csv", index = False)
zip文件的格式,代码如下
df = pd.read_csv("data.csv")compression_opts = dict(method='zip',
archive_name='output.csv')
df.to_csv('output.zip', index=False,
compression=compression_opts)
read_excel()方法和
to_excel()方法
read_excel()方法
要是我们的数据是存放在excel当中就可以使用
read_excel()方法,该方法中的参数和上面提到的
read_csv()方法相差不多,这里就不做过多的赘述,我们直接来看代码
df = pd.read_excel("test.xlsx")
- dtype: 该参数能够对指定某一列的数据类型加以设定
0 name1 1.0
1 name2 2.0
2 name3 3.0
3 name4 4.0
-
sheet_name: 对于读取
excel当中的哪一个
sheet当中的数据加以设定
0 name1 10
1 name2 10
2 name3 20
3 name4 30
Sheet当中的数据也是可以的,最后返回的数据是以
dict形式返回的
df = pd.read_excel("test.xlsx", sheet_name=["Sheet1", "Sheet3"])
0 name1 1
1 name2 2
2 name3 3
3 name4 4, 'Sheet3': Name Value
0 name1 10
1 name2 10
2 name3 20
3 name4 30}
Sheet1的数据,可以这么来做
df1.get("Sheet1")
0 name1 1
1 name2 2
2 name3 3
3 name4 4
to_excel()方法
将DataFrame对象写入
Excel表格,除此之外还有
ExcelWriter()方法也有着异曲同工的作用,代码如下
df1 = pd.DataFrame([['A', 'B'], ['C', 'D']],index=['Row 1', 'Row 2'],
columns=['Col 1', 'Col 2'])
df1.to_excel("output.xlsx")
Sheet的名称
df1.to_excel("output.xlsx", sheet_name='Sheet_Name_1_1_1')
DataFrame数据集输出到一个
Excel当中的不同的
Sheet当中
df2 = df1.copy()with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet_name_1_1_1')
df2.to_excel(writer, sheet_name='Sheet_name_2_2_2')
Sheet的基础之上,再添加一个
Sheet
df3 = df1.copy()with pd.ExcelWriter('output.xlsx', mode="a", engine="openpyxl") as writer:
df3.to_excel(writer, sheet_name='Sheet_name_3_3_3')
Excel文件并且进行压缩包处理
with zipfile.ZipFile("output_excel.zip", "w") as zf:with zf.open("output_excel.xlsx", "w") as buffer:
with pd.ExcelWriter(buffer) as writer:
df1.to_excel(writer)
df = pd.DataFrame(
[
[date(2019, 1, 10), date(2021, 11, 24)],
[datetime(2019, 1, 10, 23, 33, 4), datetime(2021, 10, 20, 13, 5, 13)],
],
index=["Date", "Datetime"],
columns=["X", "Y"],
)
with pd.ExcelWriter(
"output_excel_date.xlsx",
date_format="YYYY-MM-DD",
datetime_format="YYYY-MM-DD HH:MM:SS"
) as writer:
df.to_excel(writer)
read_table()方法
对于txt文件,既可以用
read_csv()方法来读取,也可以用
read_table()方法来读取,其中的参数和read_csv()当中的参数大致相同,这里也就不做过多的赘述
df = pd.read_table("test.txt", names = ["col1", "col2"], sep=' ')
0 1 2
1 3 4
2 5 6
3 7 8
4 9 10
5 11 12
sep参数上面需要设置成空格
read_pickle()方法和to_pickle()方法
Python当中的
Pickle模块实现了对一个
Python对象结构的二进制序列和反序列化,序列化过程是将文本信息转变为二进制数据流,同时保存数据类型。例如数据处理过程中,突然有事儿要离开,可以直接将数据序列化到本地,这时候处理中的数据是什么类型,保存到本地也是同样的类型,反序列化之后同样也是该数据类型,而不是从头开始处理
to_pickle()方法
我们先将DataFrame数据集生成
pickle文件,对数据进行永久储存,代码如下
df1.to_pickle("test.pkl")
read_pickle()方法
代码如下
read_xml()方法和
to_xml()方法
XML指的是可扩展标记语言,和JSON类似也是用来存储和传输数据的,还可以用作配置文件
XML和HTML之间的差异
XML和HTML为不同的目的而设计的
- XML被设计用来传输和存储数据,其重点是数据的内容
- HTML被设计用来显示数据,其焦点是数据的外观
- XML不会替代HTML,是对HTML的补充
to_xml()方法生成XML数据
df = pd.DataFrame({'shape': ['square', 'circle', 'triangle'],'degrees': [360, 360, 180],
'sides': [4, np.nan, 3]})
df.to_xml("test.xml")
pandas中的
read_xml()方法来读取数据
df = pd.read_xml("test.xml")
0 square 360 4.0
1 circle 360 NaN
2 triangle 180 3.0
read_clipboard()方法
有时候数据获取不太方便,我们可以通过复制的方式,通过Pandas当中的
read_clipboard()方法来读取复制成功的数据,例如我们选中一部分数据,然后复制,运行下面的代码
df_1 = pd.read_clipboard()
0 1 2 3 4
1 6 12 7 9
2 11 13 15 18
3 12 10 16 18
to_clipboard()方法
有复制就会有粘贴,我们可以将DataFrame数据集输出至剪贴板中,粘贴到例如
Excel表格中
df.to_clipboard()