iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 29
1
Software Development

糊裡糊塗Python就上手系列 第 29

[2020鐵人賽Day29]糊裡糊塗Python就上手-Pandas的觀念與運用(下)

今日目標

學習了解 Python Pandas 資料存取與運用視覺化呈現數據

DataFrame 資料操作

在提到 Python Pandas 資料存取與運用視覺化呈現數據前,先補充說明一下昨天提到的 DataFrame 如何操作資料內容

DataFrame 資料排序

資料排序 說明
df.sort_values(by = "欄位"[, ascending = 布林值]) 根據資料數值排序,by 作為排序值的欄位,ascending的話,True 表示遞增(未設定此參數的話,此為預設值)),False 表示遞減
df.sort_index(axis=軸向編號[, ascending = 布林值]) 根據軸向排序,axis 軸向編號,0 表示依照索引名稱排序,1 表示依照欄位名稱排序

完整代碼

import pandas as pd

dictValue = {
    "Chinese": {"A1":68, "A2":86, "A3":57},
    "Engilsh": {"A1":63, "A2":92, "A3":83},
    "Math": {"A1":65, "A2":89, "A3":77}
}
df = pd.DataFrame(dictValue)
print(df) # 印出所有數值
print("-" * 40)

print("使用欄位「Math」做遞減排序:\n", df.sort_values(by="Math", ascending=False))
print("-" * 40)
print("使用索引名稱做遞減排序:\n", df.sort_index(axis=0, ascending=False))

https://ithelp.ithome.com.tw/upload/images/20201014/20091333isaApXwL00.png

DataFrame 資料更新

若是 DataFrame 想要更新資料,可以使用 loc() 方法,其語法為:

df.loc["索引名稱"]["欄位名稱"] = 將更改的數值

情境一:將 A2 的 Engilsh 更改為 76
情境二:將 A3 的所有欄位更改為 100

完整代碼

import pandas as pd

dictValue = {
    "Chinese": {"A1":68, "A2":86, "A3":57},
    "Engilsh": {"A1":63, "A2":92, "A3":83},
    "Math": {"A1":65, "A2":89, "A3":77}
}
df = pd.DataFrame(dictValue)
print(df) # 印出所有數值
print("-" * 40)

# 情境一
df.loc["A2"]["Engilsh"] = 76 # 將 A2 的 Engilsh 更改為 76

# 情境二
df.loc["A3", :] = 100 # 將 A3 的所有欄位更改為 100
print(df) # 印出所有數值

https://ithelp.ithome.com.tw/upload/images/20201014/20091333wfDJDB8gFH.png

DataFrame 資料刪除

若是 DataFrame 想要刪除資料,可以使用 drop() 方法,其語法為:
(axis 軸向編號,0 代表為列(索引名稱),1 代表為欄(欄位名稱))

變數名稱 = df.drop(索引名稱或欄位名稱[, axis=軸向編號])

情境一:刪除索引 A3 所有數值
情境二:刪除欄位 Engilsh 所有數值

完整代碼

import pandas as pd

dictValue = {
    "Chinese": {"A1":68, "A2":86, "A3":57},
    "Engilsh": {"A1":63, "A2":92, "A3":83},
    "Math": {"A1":65, "A2":89, "A3":77}
}
df = pd.DataFrame(dictValue)
print(df) # 印出所有數值
print("-" * 40)

# 情境一
df2 = df.drop("A3", axis=0) # 刪除索引 A3 所有數值
print(df2) # 印出所有數值
print("-" * 40)

# 情境二
df3 = df.drop("Engilsh", axis=1) # 刪除欄位 Engilsh 所有數值
print(df3) # 印出所有數值

https://ithelp.ithome.com.tw/upload/images/20201014/20091333xq52QSkC7M.png

大範圍刪除數值

# 依照給予的索引位置刪除,軸向編號 axis=0
變數名稱 = df.drop(df.index[起始位置:終止位置][, axis=軸向編號])

# 依照給予的欄位位置刪除,軸向編號 axis=1
變數名稱 = df.drop(df.columns[起始位置:終止位置][, axis=軸向編號])

Pandas 資料存取

Pandas 可以從 CSV、Excel、SQL、JSON、HTML中取得資料,匯入後再轉換為 DataFrame 進行資料的修改、排序等等動作

Pandas 讀取資料

匯入方法 說明
read_csv 匯入 CSV 資料
read_excel 匯入 Excel 資料
read_sql 匯入 SQL 資料庫資料
read_json 匯入 JSON 格式資料
read_html 匯入 HTML 網頁表格資料

Pandas 儲存資料

儲存方法 說明
to_csv 儲存為 CSV 檔案資料
to_excel 儲存為 Excel 檔案資料
to_sql 儲存為 SQL 資料庫資料
to_json 儲存為 JSON 格式資料
to_html 儲存為 HTML 網頁表格資料

實際體驗

讓我們先用先前範例的 Dictionary data,運用 Pandas to_csv 儲存 DataFrame 資料
to_csv 語法:

pandas.to_csv(檔案名稱[, header=布林值, index=布林值, encoding=編碼, sep=分隔符號])

其中,header 為是否要保留欄位(預設為 True),index 為是否要保留索引(預設為 True)

完整代碼

import pandas as pd

dictValue = {
    "Chinese": {"A1":68, "A2":86, "A3":57},
    "Engilsh": {"A1":63, "A2":92, "A3":83},
    "Math": {"A1":65, "A2":89, "A3":77}
}
df = pd.DataFrame(dictValue)

df.to_csv('pandas_example.csv', encoding='utf-8-sig')

執行後開啟 CSV 檔案內容:
https://ithelp.ithome.com.tw/upload/images/20201014/20091333x32mUARTGh.png


使用 Pandas read_csv 讀出剛產出的 pandas_example.csv 檔案內容,並印出資料格式
read_csv 語法:

pandas.read_csv(檔案名稱[, header=欄位列, index=索引列, encoding=編碼, sep=分隔符號])

完整代碼

import pandas as pd

data = pd.read_csv("pandas_example.csv", header=0, index_col=0)
print(data)
print(type(data))

執行後畫面:
https://ithelp.ithome.com.tw/upload/images/20201014/20091333UtLNyls3nY.png

Pandas 視覺化呈現數據

plot 繪製

Pandas 模組是以 DataFrame資料的 plot() 方法將數據繪製出來,其語法為:
(可以不用設定其餘參數即可呈現,kind 預設為 line 折線圖)

DataFrame.plot([kind='圖形mode', title=None, figsize=None, fontsize=None, xticks=None, yticks=None, xlim=None, ylim=None, grid=False, legend=True])
DataFrame plot參數 說明 預設值
kind 圖形模式 line
title 圖形標題 None
figsize 圖形大小 None
fontsize 圖形 x、y 軸的字體大小 None
xticks 圖形 x 軸的刻度值 None
yticks 圖形 y 軸的刻度值 None
xlim 圖形 x 軸的刻度範圍 None
ylim 圖形 y 軸的刻度範圍 None
grid 是否顯示隔線 False
legend 是否顯示圖示說明 True
kind 參數值 說明

line|折線圖
bar|長條圖
barh|橫條圖
pie|圓餅圖
hist|直方圖


使用 Pandas read_csv 讀出剛產出的 pandas_example.csv 檔案內容,並印出「折線圖」、「長條圖」、「橫條圖」、「圓餅圖」
(這邊的「圓餅圖」需要使用到 subplot=True 這個參數,這會讓多張圖表放置在同一個區域中)
完整代碼

import pandas as pd

df = pd.read_csv("pandas_example.csv", header=0, index_col=0)

df.plot(kind='line', figsize=(5,5), title='Pandas plot line') # 折線圖
df.plot(kind='bar', figsize=(5,5), title='Pandas plot bar') # 長條圖
df.plot(kind='barh', figsize=(5,5), title='Pandas plot barh') # 橫條圖
df.plot(kind='pie', figsize=(16,16), title='Pandas plot pie', subplots=True) # 圓餅圖

執行後畫面:
https://ithelp.ithome.com.tw/upload/images/20201014/20091333uiMV3fIMpQ.png
https://ithelp.ithome.com.tw/upload/images/20201014/20091333ha4JrAadpo.png

結論

紀錄到此,Python Pandas 資料存取與運用視覺化呈現數據的部分就簡單的帶過了,希望各位能藉由上述的範例體會上手,並靈活應用於實務上


上一篇
[2020鐵人賽Day28]糊裡糊塗Python就上手-Pandas的觀念與運用(上)
下一篇
[2020鐵人賽Day30]糊裡糊塗Python就上手-體驗 OpenCV 人臉辨識
系列文
糊裡糊塗Python就上手30

尚未有邦友留言

立即登入留言