MaDi's Blog

一個紀錄自己在轉職軟體工程師路上的學習小空間

0%

Pandas常用語法整理(五) 讀檔/繪圖/DataFrame特殊技巧

Table of Contents:

  1. 讀檔: read_csv/json/excel/html/clipboard/sql
  2. DataFrame繪圖: 折線圖/柱狀圖/直方圖…
  3. DataFrame特殊技巧: style/sample.set_option…

讀檔

pd.read_csv()

chunksize: 決定一次要讀進幾列,避免檔案太大
encoding: 編碼
nrows: 讀幾列進來

1
df = pd.read_csv('本地檔案' or '網路url', chunksize=N ,encoding='utf-8',nrows=4)

pd.read_json()

pd.read_excel()

pd.read_html()

pd.read_clipboard()

複製Excel、Google Sheet或是網頁上的表格,將剪貼簿內容轉換成DataFrame

1
2
step1. 複製Excel、Google Sheet或是網頁上的表格
step2. pd.read_clipboard()

pd.read_sql()

sql: SQL語法
con: 連接SQL數據庫的engine, 常見有sqlalchemypymysqlpyodbc
index_col: 選擇某一列作為index
coerce_float: 將數字型態的string以float讀入

<p.s> df.tosql()

1
df_new.to_sql(tblName, con=engine, if_exists='replace',dtype={col_name: sqlalchemy.types.NVARCHAR for col_name in df_new},index=False)

dtype在函式裡定義比較不會有編碼問題。

繪圖

Pandas有以下類型的圖可以繪製

1
2
3
4
5
6
7
8
9
10
折線圖 df.plot()
柱狀圖 df.plot(kind='bar')
橫向柱狀圖 df.plot(kind='barh')
直方圖 df.plot(kind='hist')
KDE圖 df.plot(kind='kde')
面積圖 df.plot(kind='area')
圓餅圖 df.plot(kind='pie')
散佈圖 df.plot(kind='scatter')
六角形箱體圖 df.plot(kind='hexbin')
箱形圖 df.plot(kind='box')

DataFrame特殊技巧

pd.util.testing

隨機建立DataFrame

1
pd.util.testing.makeDataFrame().head(5)

1
pd.util.testing.makeCustomDataframe(5,3)

DataFrame. info(memory_usage=”deep”)

查看DataFrame的記憶體使用量

<p.s> 將已知分類的欄位資料型態轉為category較省記憶體空間

1
2
3
dtypes = {"已知分類欄位名稱": "category"} // 轉成catogory較省記憶體
df = pd.read_csv('檔案url', dtype=dtypes)
df.info(memory_usage="deep") // 查看記憶體

pd.set_option()

把某些顯示設定套用到所有DataFrames

1. DataFrame顯示所有欄位

1
pd.set_option("display.max_columns", None)

2. 改變DataFrame欄位的寬度

1
pd.set_option("display.max_colwidth", N)  // N = -1 代表全顯示

3. 改變浮點數(float)顯示位數

1
pd.set_option("display.precision", N)

4. 重設

1
pd.reset_option("all")

DataFrame.style

不想改全部的DataFrame, 僅客製化某些欄位

1
2
3
4
5
6
7
8
9
(demo.style
.format('{:.1f}', subset='Fare') //'Fare'欄位顯示浮點一位
.set_caption('客製化五彩繽紛的鐵達尼號數據') // df標題
.hide_index() // 隱藏最左邊的index
.bar('Age', vmin=0) // 'Age'欄位依數值大小畫條狀圖
.highlight_max('Survived') // 'Survived'欄位最大值highlight
.background_gradient('Greens',subset='Fare') // 'Fare'欄位依數值大小畫綠色的colormap
.highlight_null() // 整個df中NaN畫紅色
)

DataFrame.sample(frac, random_state)

將DataFrame隨機切成兩個子集

常用於機器學習中的train,test切分

1
2
3
4
5
6
7
df_train = demo.sample(frac=0.8, random_state=5566)
df_test = demo.drop(df_train.index)

# display() -> 顯示結果
display(df_train)
display(df_test)
print('各 DataFrame 大小:', len(demo), len(df_train), len(df_test))

DataFrame.value_counts(欄位)

預設會把某欄位裡的值依據頻率高到低排列

1
display(demo['Age'].value_counts().head(5).reset_index())

df.describe()

一行描述數值欄位(最小值、最大值、平均和中位數…)

1
demo.describe()

tqdm進度條

DataFrame.progress_apply()

1
2
3
4
from tqdm import tqdm_notebook
tqdm_notebook().pandas()

df.某欄位.progress_apply(運算...)

swifter加速數據處理

DataFrame.swifter.apply()

最有效率的方式執行apply函式

1
2
3
import swifter

df.某欄位.swifter.apply(運算...)

參考