python
pandas
Pandas模組是Python語言一個高效能、簡易使用的資料操作和分析工具,可以將它看作是微軟Excel或是MacOS Numbers試算表軟體的程式版本,就像是透過Python來操作像試算表內的資料。
主要特色如下:
安裝語法如下:
執行結果:
說明:
執行結果:
說明:
透過傳入name這個list來建立Series物件,並指定index參數為no這個list作為索引值。
補充:
- 兩個list的長度必須一樣,否則會有「ValueError: Length of passed values is 5, index implies 4.」錯誤。
- 索引可以是整數也可以是字串。
執行結果:
執行結果:
注意:
- 索引清單為一個list。
- 取出的值為一個新的Series物件。
直接對Series物件做四則運算。
執行結果:
DataFrame結構為一個表格,類似微軟Excel或蘋果Numbers試算表:
補充:
在Excel內,橫的為row,稱為列,而直的為column,稱為欄或行,但須注意,中國大陸對行與列的稱呼和台灣剛好相反:橫的為行,直的為列。
執行結果:
說明:
透過使用Python字典(dict)來建立DataFrame;左邊第一行為自動產生的預設索引。
如果建立時沒有指定索引,預設會是從0開始,和Series一樣,我們也可以提供一個清單(list) 來自訂索引。
執行結果:
說明:
三個索引分別對應三筆資料,索引和資料筆數必須對應,否則會出現錯誤。
建立DataFrame時可以同時指定一個清單(list)給columns
參數,就會改變原本字典(dict)裡的欄位順序。
執行結果:
使用T
屬性,可以改變結構,讓欄變成列,列變成欄。
方法 | 說明 |
---|---|
read_csv(filename) | 匯入CSV格式檔案。 |
read_json(filename) | 匯入JSON格式檔案。 |
read_html(filename) | 匯入HTML格式檔案,Pandas僅會抽出<table>標籤內資料。 |
read_excel(filename) | 匯入Excel檔案。 |
read_sql(query, conn) | 匯入資料庫資料,query為SQL查詢語法,conn為資料庫連線。 |
補充:
read_excel()
方法需要安裝openpyxl
模組。
補充:
指定index_col=0,就不會出現unnamed欄位(其實就是原本的索引值欄位)。
方法 | 說明 |
---|---|
to_csv(filename) | 匯出成CSV格式檔案。 |
to_json(filename) | 匯出成JSON格式檔案。 |
to_html(filename) | 匯出成HTML格式檔案。 |
to_excel(filename) | 匯出成Excel格式檔案。 |
to_sql(table_name, conn) | 匯出到資料庫,table_name為資料表名稱,conn為資料庫連線。 |
補充:
- to_excel()方法需要安裝openpyxl模組。
補充:
sqlalchemy模組安裝:
pip3 installsqlalchemy
iterrows()
補充:
row
為一個Series物件。
head()
方法補充:
DataFrame和Series皆提供此方法。
tail()
方法補充:
DataFrame和Series皆提供此方法。
info()
方法取得DataFrame的摘要資訊。
len()
方法取得Series或DataFrame的資料筆數。
shape
屬性取得Series或DataFrame的輪廓。
reset_index()
重新設定index
to_numeric()
轉換Series的欄位資料
astype()
將Series或DataFrame內的欄位資料做轉型
df[欄名]
df[列名開始:列名結束]
df[列名, 欄名]
執行結果:
其結果為一個Series
也可這樣寫:
執行結果:
其結果為一個DataFrame
可以使用像Python清單(list)的索引切片運算子來選擇一個範圍的資料:
執行結果:
不包含索引3的資料
也可以使用自訂索引的名稱來選擇資料:
執行結果:
注意:
與Python清單索引切片不同,這裡會包含最後一筆D欄位的資料。
df.loc[列名]
:取得特定的列的資料df.loc[:, 行名]
: 取得特定的行的資料df.loc[列名, 行名]
:取得特定行列的資料回傳值為一個Series物件。
執行結果:
回傳值為一個DataFrame物件。
執行結果:
回傳值回一個DataFrame物件。
執行結果:
也可以這樣寫:
與loc
的差別為:
loc
是以名稱來定位資料,而iloc
是以位置來定位資料。loc
的切片會包含結束位置的資料,而iloc
的切片不會包含結束位置的資料。執行結果:
執行結果:
執行結果:
執行結果:
說明:
set_index()
方法來的對索引做排序。ascending=True
表示由小到的大排序。inplace=True
表示取代原本的df2
資料,如果為False
,該方法會回傳一個新的DataFrame。append()
方法來新增補充:
透過append()
新增後會產生一個新的DataFrame物件,原來的DataFrame物件不會有變化。Pandas 2.0移除
append()
方法,可以使用concat()
方法來替代
concat()
方法來新增資料或
執行結果:
執行結果:
執行結果:
補充:
加上
axis=1
參數代表要刪除的是欄位。如果只是要刪除一個欄位,也可以寫成
df2 = df.drop('學號', axis=1)
執行結果:
會建立一個所有欄位值都是None DataFrame物件。
建立一個完全一樣的DataFrame物件。
執行結果:
說明:
ignore_index
會重新給索引,從0開始。concat()
方法傳入的是一個清單,所以可以連接兩個以上的DataFrame。將有不同欄位的DataFrame合併再一起。
執行結果:
on
:要使用哪一個欄位作為主鍵,如果沒有指定該參數,則預設會有重複欄位名稱的值都要相同才會被合併left_index
、right_index
:是否要使用索引值當作主鍵how
:要保留哪一邊的資料,沒有可以合併的欄位,會填入NaN
,有inner
(交集)、outer
(聯集)、left
、right
,預設為`inner``lefton
、righton
:當出現欄位資料一樣,但是欄位名不一樣,可以指定左右兩個Dataframe要使用的主鍵名稱。suffixes
:當左右兩個表出現相同欄位名的時候,要如何顯示後綴,預設為_x
和_y
indicator
:合併後的表格最後面會多一欄紀錄該筆資料是來自哪一張表格,兩張表格都有,會標記為both
執行結果:
補充
df.groupby('日期').sum()
也可以寫成df.groupby('日期').apply(sum)
執行結果:
astype(int)
是為了去掉小數點,或是可以改為round(0)
做四捨五入。
你也可以在groupby()方法後面透過索引的方式來指定處理的欄位,如果有多個欄位則需使用list存放多個欄位的名稱,例如:
補充
在Pandas1.0.0以後,如果要加總多個欄位,在索引的地方直接使用多個索引(
['交通', '飲食']
),而沒有使用list,會出現下面警告:所以需要將多個欄位名稱使用list來存放:
改為:
透過apply()
方法可呼叫我們自訂的函式還處理每個欄位資料。
執行結果:
說明:
apply()
後回傳為一個Series。
下面有一個公司人事資料的excel:
備註:
如果沒有該檔案,可以先用下面程式碼產生excel檔案。
111年度公司預計依據年資來幫員工調薪,條件為:
計算調薪後薪水為:
Aggregation | Description |
---|---|
count() | 聚合的元素數量 |
first(), last() | 第一個和最後一個元素 |
mean(), median() | Mean and median |
min(), max() | Minimum and maximum |
std(), var() | Standard deviation and variance |
mad() | Mean absolute deviation |
prod() | Product of all items |
sum() | Sum of all items |