20個經(jīng)典函數(shù)細說?Pandas?中的數(shù)據(jù)讀取與存儲,強烈建議收藏
我們大致會說到的方法有:
-
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()
我們一般讀取數(shù)據(jù)都是從數(shù)據(jù)庫中來讀取的,因此可以在read_sql()方法中填入對應(yīng)的
sql語句然后來讀取我們想要的數(shù)據(jù),
pd.read_sql(sql, con, index_col=None,coerce_float=True, params=None,
parse_dates=None,
columns=None, chunksize=None)
- sql: SQL命令字符串
- con: 連接SQL數(shù)據(jù)庫的Engine,一般用SQLAlchemy或者是PyMysql之類的模塊來建立
- index_col:選擇某一列作為Index
- coerce_float:將數(shù)字形式的字符串直接以float型讀入
- parse_dates: 將某一列日期型字符串傳喚為datatime型數(shù)據(jù),可以直接提供需要轉(zhuǎn)換的列名以默認的日期形式轉(zhuǎn)換,或者也可以提供字典形式的列名和轉(zhuǎn)換日期的格式,
PyMysql這個模塊來連接數(shù)據(jù)庫,并且讀取數(shù)據(jù)庫當中的數(shù)據(jù),首先我們導(dǎo)入所需要的模塊,并且建立起與數(shù)據(jù)庫的連接
import pandas as pdfrom pymysql import *
conn = connect(host='localhost', port=3306, database='database_name',
user='', password='', charset='utf8')
SQL命令來讀取數(shù)據(jù)庫當中的數(shù)據(jù),并且用read_sql()方法來讀取數(shù)據(jù)
sql_cmd = "SELECT * FROM table_name"df = pd.read_sql(sql_cmd, conn)
df.head()
read_sql()方法當中
parse_dates參數(shù)可以對日期格式的數(shù)據(jù)進行處理,那我們來試一下其作用
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類型的數(shù)據(jù),要是我們通過
parse_dates參數(shù)將日期解析應(yīng)用與該列
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當中的數(shù)據(jù)存放到數(shù)據(jù)庫當中,請看下面的示例代碼,我們創(chuàng)建一個基于內(nèi)存的
SQLite數(shù)據(jù)庫
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參數(shù)上面填的是
append,意味著添加新數(shù)據(jù)進去,當然我們也可以將原有的數(shù)據(jù)替換掉,將
append替換成
replace
df2.to_sql('nums', con=engine, if_exists='replace')engine.execute("SELECT * FROM nums").fetchall()
from_dict()方法和
to_dict()方法
有時候我們的數(shù)據(jù)是以字典的形式存儲的,有對應(yīng)的鍵值對,我們?nèi)绾胃鶕?jù)字典當中的數(shù)據(jù)來創(chuàng)立DataFrame,假設(shè)
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參數(shù),用來指定字典當中的鍵是用來做行索引還是列索引,請看下面兩個例子
data = {'col_1': [1, 2, 3, 4],'col_2': ['A', 'B', 'C', 'D']}
orient參數(shù)設(shè)置為
columns,將當中的鍵當做是列名
df = pd.DataFrame.from_dict(data, orient='columns')
0 1 A
1 2 B
2 3 C
3 4 D
orient設(shè)置為是
index
df = pd.DataFrame.from_dict(data, orient='index')
col_1 1 2 3 4
col_2 A B C D
to_dict()方法
語法如下:
orient參數(shù),一般可以填這幾種形式
一種是默認的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()方法
我們經(jīng)常也會在實際工作與學習當中遇到需要去處理JSON格式數(shù)據(jù)的情況,我們用
Pandas模塊當中的
read_json()方法來進行處理,我們來看一下該方法中常用到的參數(shù)
orient:對應(yīng)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: 數(shù)組
df_1 = pd.read_json(v, orient="values")
0 a 1
1 b 2
2 c 3
to_json()方法
將DataFrame數(shù)據(jù)對象輸出成
JSON字符串,可以使用
to_json()方法來實現(xiàn),其中
orient參數(shù)可以輸出不同格式的字符串,用法和上面的大致相同,這里就不做過多的贅述
read_html()方法和
to_html()方法
有時候我們需要抓取網(wǎng)頁上面的一個表格信息,相比較使用Xpath或者是
Beautifulsoup,我們可以使用
pandas當中已經(jīng)封裝好的函數(shù)
read_html來快速地進行獲取,例如我們通過它來抓取菜鳥教程Python網(wǎng)站上面的一部分內(nèi)容
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 用戶中斷執(zhí)行(通常是輸入^C)
4 Exception 常規(guī)錯誤的基類
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讀取數(shù)據(jù)的方法之一,其中我們經(jīng)常用到的參數(shù)有
- filepath_or_buffer: 數(shù)據(jù)輸入的路徑,可以是文件的路徑的形式,例如
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參數(shù)也做相應(yīng)的設(shè)定
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:如果數(shù)據(jù)集當中的列很多,而我們并不想要全部的列、而是只要指定的列就可以,就可以使用這個參數(shù)
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: 當導(dǎo)入的數(shù)據(jù)沒有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設(shè)為None,
pandas則會自動生成表頭0, 1, 2, 3..., 然后我們設(shè)置
prefix參數(shù)為表頭添加前綴
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: 過濾掉哪些行,參數(shù)當中填行的索引
0 11 13 15 18
1 12 10 16 18
- nrows: 該參數(shù)設(shè)置一次性讀入的文件行數(shù),對于讀取大文件時非常有用,比如 16G 內(nèi)存的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()方法
要是我們的數(shù)據(jù)是存放在excel當中就可以使用
read_excel()方法,該方法中的參數(shù)和上面提到的
read_csv()方法相差不多,這里就不做過多的贅述,我們直接來看代碼
df = pd.read_excel("test.xlsx")
- dtype: 該參數(shù)能夠?qū)χ付骋涣械臄?shù)據(jù)類型加以設(shè)定
0 name1 1.0
1 name2 2.0
2 name3 3.0
3 name4 4.0
-
sheet_name: 對于讀取
excel當中的哪一個
sheet當中的數(shù)據(jù)加以設(shè)定
0 name1 10
1 name2 10
2 name3 20
3 name4 30
Sheet當中的數(shù)據(jù)也是可以的,最后返回的數(shù)據(jù)是以
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的數(shù)據(jù),可以這么來做
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數(shù)據(jù)集輸出到一個
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的基礎(chǔ)之上,再添加一個
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()方法來讀取,其中的參數(shù)和read_csv()當中的參數(shù)大致相同,這里也就不做過多的贅述
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參數(shù)上面需要設(shè)置成空格
read_pickle()方法和to_pickle()方法
Python當中的
Pickle模塊實現(xiàn)了對一個
Python對象結(jié)構(gòu)的二進制序列和反序列化,序列化過程是將文本信息轉(zhuǎn)變?yōu)槎M制數(shù)據(jù)流,同時保存數(shù)據(jù)類型。例如數(shù)據(jù)處理過程中,突然有事兒要離開,可以直接將數(shù)據(jù)序列化到本地,這時候處理中的數(shù)據(jù)是什么類型,保存到本地也是同樣的類型,反序列化之后同樣也是該數(shù)據(jù)類型,而不是從頭開始處理
to_pickle()方法
我們先將DataFrame數(shù)據(jù)集生成
pickle文件,對數(shù)據(jù)進行永久儲存,代碼如下
df1.to_pickle("test.pkl")
read_pickle()方法
代碼如下
read_xml()方法和
to_xml()方法
XML指的是可擴展標記語言,和JSON類似也是用來存儲和傳輸數(shù)據(jù)的,還可以用作配置文件
XML和HTML之間的差異
XML和HTML為不同的目的而設(shè)計的
- XML被設(shè)計用來傳輸和存儲數(shù)據(jù),其重點是數(shù)據(jù)的內(nèi)容
- HTML被設(shè)計用來顯示數(shù)據(jù),其焦點是數(shù)據(jù)的外觀
- XML不會替代HTML,是對HTML的補充
to_xml()方法生成XML數(shù)據(jù)
df = pd.DataFrame({'shape': ['square', 'circle', 'triangle'],'degrees': [360, 360, 180],
'sides': [4, np.nan, 3]})
df.to_xml("test.xml")
pandas中的
read_xml()方法來讀取數(shù)據(jù)
df = pd.read_xml("test.xml")
0 square 360 4.0
1 circle 360 NaN
2 triangle 180 3.0
read_clipboard()方法
有時候數(shù)據(jù)獲取不太方便,我們可以通過復(fù)制的方式,通過Pandas當中的
read_clipboard()方法來讀取復(fù)制成功的數(shù)據(jù),例如我們選中一部分數(shù)據(jù),然后復(fù)制,運行下面的代碼
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()方法
有復(fù)制就會有粘貼,我們可以將DataFrame數(shù)據(jù)集輸出至剪貼板中,粘貼到例如
Excel表格中
df.to_clipboard()