一張表就是一次分析:pandas

先備知識 P4 — 選讀,不列入評分
Series 與 DataFrame|head describe shape|loc 靠名字 iloc 靠位置|? 要在讀檔時就處理|dropna 397→392|groupby 拆分-套用-合併|concat
向下捲動開始互動↓
📌 本頁使用方式(先備 · pandas 資料框)

① 依序閱讀:每節先讀說明;遇到互動元件時,先預測結果,再操作驗證。 ② 對照程式範例:程式碼卡下方的「來源」標了課程練習筆記本(lab);需要實作時,再打開原始筆記本對照。 ③ 檢查理解:答錯時先看回饋,再回到相關說明;標為延伸的內容可留待第二輪。 ④ 最後翻關鍵詞彙卡自測術語,並用 重點速查與來源查閱。

教科書:An Introduction to Statistical Learning with Applications in Python(ISLP)。章節旁的來源標記可點到本頁書目。

CONTENTS · 內容目錄
PROLOGUE · 開場

一欄是 Series,一張表是 DataFrame 課程 Lab Ch1 · lab 範例

pandas 用標籤管理資料,讓你可以依欄名「mpg」取值,也可以指定「第 3 欄」這類位置。 一維資料稱為 Series,二維資料表稱為 DataFrame。

一句話 Series ≈ 有索引的一維陣列,DataFrame ≈ 共用同一個索引的一疊 Series。底下算數字的還是 NumPy。
›從字典開始,看它怎麼變成 Series 再變成 DataFrame。
課程/lab 資料
三種東西的關係
按按鈕切換。字典的鍵變成索引、值變成資料;幾個 Series 疊起來、共用同一個索引,就是 DataFrame。
目前
型別Series
索引d b a c
dtypeint64
每一欄可以是不同型別
DataFrame 的 dtypes 是逐欄的:state 是 object、year 是 int64、pop 是 float64。這一點跟 NumPy 陣列不同——陣列整塊只能有一個型別。
自訂索引的 Series
s2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"]) s2
預期輸出
d    4
b    7
a   -5
c    3
dtype: int64

左邊那一排 d b a c 是索引,不是資料。

來源:Ch01-lab-zh.ipynb
用字典建 DataFrame
data = {"state": ["Ohio", "Ohio", "Ohio", "Nevada", "Nevada", "Nevada"], "year": [2000, 2001, 2002, 2001, 2002, 2003], "pop": [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} frame = pd.DataFrame(data) frame
預期輸出
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

鍵變成欄名,值變成那一欄的內容。列索引沒指定時就是 0、1、2…

來源:Ch01-lab-zh.ipynb
每一欄各自的型別
frame.dtypes
預期輸出
state     object
year       int64
pop      float64
dtype: object
來源:Ch01-lab-zh.ipynb
PART 00 · 自我檢測

frame['pop'] 拿到的是什麼?

(A) 一個 NumPy 陣列
(B) 一個 DataFrame,只有一欄
(C) 一個 Series,帶著原本的列索引
PART 01 · 先看,再算

拿到資料的前五分鐘:head、describe、shape 課程 Lab Ch1 · lab 範例

拿到一份沒看過的資料,前五分鐘不要急著建模。先跑這四行: shape 看有多大、head() 看長什麼樣、 describe() 看數值範圍合不合理、dtypes 看有沒有欄被讀成字串。 第四項最常出事,下一節會看到。

›四行指令,按順序看過一遍。
課程/lab 資料
四行指令各自告訴你什麼
按按鈕,看每一行揭露的是哪一塊資訊。四個指令各提供一部分資料資訊,可以互相對照。
這一行告訴你
指令df.shape
揭露什麼資料有多大
看到什麼要警覺列數比預期少很多
順序有意義
先 shape 再 dtypes——型別會影響 describe() 彙總哪些欄位,先核對型別再讀摘要。
看前幾列與後幾列
# 檢視資料基本資訊/摘要 df.head() # Get the first 5 rows of data df.tail(3) # Get the last 3 rows of data
查看完整 Lab 輸出
預期輸出
                   A         B         C         D
2025-09-01 -0.397297 -1.061537  1.455216  0.632237
2025-09-02 -0.840037 -1.592677 -0.604842 -1.500806
2025-09-03  0.501820 -0.662466  0.146713  0.293567
2025-09-04 -1.060077 -1.010073  0.553983  0.211157
2025-09-05 -0.109702  0.236859 -0.203407  0.695861
                   A         B         C         D
2025-09-04 -1.060077 -1.010073  0.553983  0.211157
2025-09-05 -0.109702  0.236859 -0.203407  0.695861
2025-09-06  0.157943 -0.966041  0.844384  1.641228

head() 預設五列,tail(3) 給最後三列。

來源:Ch01-lab-zh.ipynb
五數摘要
# 檢視資料基本資訊/摘要 df.describe()
查看完整 Lab 輸出
預期輸出
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean  -0.291225 -0.842656  0.365341  0.328874
std    0.594509  0.608525  0.743696  1.030710
min   -1.060077 -1.592677 -0.604842 -1.500806
25%   -0.729352 -1.048671 -0.115877  0.231760
50%   -0.253499 -0.988057  0.350348  0.462902
75%    0.091032 -0.738359  0.771784  0.679955
max    0.501820  0.236859  1.455216  1.641228

count 那一列很有用。它不算遺漏值,所以某一欄的 count 比別欄少,就代表那欄有 NaN。

來源:Ch01-lab-zh.ipynb
形狀
df.shape
預期輸出
(6, 4)

跟 NumPy 一樣是 (列數, 欄數)。

來源:Ch01-lab-zh.ipynb
觀念釐清
describe() 為什麼漏掉某些欄?
它預設只算數值欄。如果你期待的欄沒出現,那一欄多半被讀成了字串(object)——這正是下一節 Auto 的 horsepower 會遇到的事。加 describe(include='all') 可以連類別欄一起看。
count 跟 len(df) 差在哪?
len(df) 是列數,count 是非遺漏的個數。兩個數字不一樣,就代表那一欄有 NaN。這可以用來檢查遺漏值。
延伸:標籤排序與資料值排序

依標籤或資料值排序

sort_index 排列列/欄的標籤;sort_values 按指定欄的數值排列資料列。 axis=1 指欄方向,ascending=False 指遞減順序。排序後標籤仍跟著原本的資料走。

欄名排序與資料值排序
# 排序/重建索引 df.sort_index(axis=1, ascending=False) # Sorting by columns in descending order # 排序/重建索引 df.sort_values(by="B")
預期輸出
                   D         C         B         A
2025-09-01  0.632237  1.455216 -1.061537 -0.397297
2025-09-02 -1.500806 -0.604842 -1.592677 -0.840037
2025-09-03  0.293567  0.146713 -0.662466  0.501820
2025-09-04  0.211157  0.553983 -1.010073 -1.060077
2025-09-05  0.695861 -0.203407  0.236859 -0.109702
2025-09-06  1.641228  0.844384 -0.966041  0.157943
                   A         B         C         D
2025-09-02 -0.840037 -1.592677 -0.604842 -1.500806
2025-09-01 -0.397297 -1.061537  1.455216  0.632237
2025-09-04 -1.060077 -1.010073  0.553983  0.211157
2025-09-06  0.157943 -0.966041  0.844384  1.641228
2025-09-03  0.501820 -0.662466  0.146713  0.293567
2025-09-05 -0.109702  0.236859 -0.203407  0.695861
來源:Ch01-lab-zh.ipynb
延伸:對齊、逐元素計算與累積量

摘要、逐元素運算與累積量

mean() 預設沿列計算各欄平均;DataFrame 相加會先對齊列與欄標籤,再逐元素相加。 apply(np.cumsum) 在這個數值表上逐欄累積加總,因此每一列表示從開頭累積到該列的總量。

數值表的三種運算
df.mean() df2 = df.copy() df2 + df # NumPy 陣列運算 df.apply(np.cumsum)
預期輸出
A   -0.291225
B   -0.842656
C    0.365341
D    0.328874
dtype: float64
                   A         B         C         D
2025-09-01 -0.794593 -2.123075  2.910432  1.264474
2025-09-02 -1.680074 -3.185354 -1.209683 -3.001613
2025-09-03  1.003641 -1.324931  0.293426  0.587134
2025-09-04 -2.120153 -2.020146  1.107965  0.422315
2025-09-05 -0.219403  0.473718 -0.406813  1.391721
2025-09-06  0.315886 -1.932082  1.688768  3.282456
                   A         B         C         D
2025-09-01 -0.397297 -1.061537  1.455216  0.632237
2025-09-02 -1.237333 -2.654214  0.850374 -0.868569
2025-09-03 -0.735513 -3.316680  0.997087 -0.575002
2025-09-04 -1.795590 -4.326753  1.551070 -0.363845
2025-09-05 -1.905291 -4.089894  1.347664  0.332016
2025-09-06 -1.747348 -5.055935  2.192048  1.973244
來源:Ch01-lab-zh.ipynb
延伸:Excel/CSV 輸出與完整參數

讀入與輸出資料表

read_csv、read_excel 將檔案讀為資料表;to_csv、to_excel 將目前的表輸出到檔案。下列兩個命令會在執行目錄建立檔案,檔名已存在時會覆寫;預設也會寫出列索引。 只想保留資料欄時可指定 index=False。Excel 讀寫另需要相容的引擎,例如 openpyxl。

將資料表存成 Excel 與 CSV
df.to_excel("foo.xlsx", sheet_name="Sheet1") df.to_csv("foo.csv")

這兩個命令的結果是檔案;lab未保存文字輸出。

來源:Ch01-lab-zh.ipynb
PART 02 · 選取列與欄

loc 靠名字、iloc 靠位置 課程 Lab Ch1 · lab 範例

pandas 的兩套選取語法使用不同的依據: loc 靠名字、iloc 靠位置。 選取之前,先確認要用標籤還是位置。

留意切片是否包含結尾 loc 的切片包含結尾,iloc 不包含。df.loc['a':'c'] 會拿到 c,df.iloc[0:3] 只拿到 0、1、2。因為名字沒有「下一個」可言,含頭不含尾對它沒有意義。
›先猜哪幾格會亮,再按。
課程/lab 資料
按按鈕比較
同一張表、四種寫法。亮起來的是被選到的格子,下面會顯示這個寫法拿到的是 DataFrame 還是 Series。
目前
寫法df[\'A\']
拿到的型別Series
形狀(6,)
那 df[…] 直接寫呢
df['A'] 取的是欄,但 df[0:3] 取的是列——同一個中括號,兩種意思。這就是為什麼建議一律用 loc/iloc 寫清楚。
取一欄與取幾列
df["A"] df[0:3] # df["20250901":"20250903"] also works
查看完整 Lab 輸出
預期輸出
2025-09-01   -0.397297
2025-09-02   -0.840037
2025-09-03    0.501820
2025-09-04   -1.060077
2025-09-05   -0.109702
2025-09-06    0.157943
Freq: D, Name: A, dtype: float64
                   A         B         C         D
2025-09-01 -0.397297 -1.061537  1.455216  0.632237
2025-09-02 -0.840037 -1.592677 -0.604842 -1.500806
2025-09-03  0.501820 -0.662466  0.146713  0.293567

注意兩者的差別:df['A'] 給 Series,df[0:3] 給 DataFrame。

來源:Ch01-lab-zh.ipynb
loc 指名字、iloc 指位置
# 欄位選取與資料清理/轉換 df.loc[:, ["A", "C"]] # Fancy indexing in the second dimension # 欄位選取與資料清理/轉換 df.iloc[3]
查看完整 Lab 輸出
預期輸出
                   A         C
2025-09-01 -0.397297  1.455216
2025-09-02 -0.840037 -0.604842
2025-09-03  0.501820  0.146713
2025-09-04 -1.060077  0.553983
2025-09-05 -0.109702 -0.203407
2025-09-06  0.157943  0.844384
A   -1.060077
B   -1.010073
C    0.553983
D    0.211157
Name: 2025-09-04 00:00:00, dtype: float64

df.iloc[3] 拿一整列,回來的是 Series——那一列的欄名變成了它的索引。

來源:Ch01-lab-zh.ipynb
用條件選列
df[df["A"] > 0]
預期輸出
                   A         B         C         D
2025-09-03  0.501820 -0.662466  0.146713  0.293567
2025-09-06  0.157943 -0.966041  0.844384  1.641228

裡面的 df['A'] > 0 就是 P3 講的布林遮罩,只是現在它帶著索引。

來源:Ch01-lab-zh.ipynb
PART 02 · 自我檢測

df.loc['b':'d'] 與 df.iloc[1:3],哪一個的敘述正確?

(A) 兩個都不包含結尾
(B) loc 會拿到 d,iloc 只拿到位置 1 和 2
(C) 兩個都包含結尾
🔗 這在本站哪一章會用到 第 3 章把類別變數放進迴歸、第 4 章切出訓練與測試集,用的都是這一節的選取語法。→ 線性迴歸 · 類別型預測變數
延伸:車名索引、重複標籤與完整輸出

把車名設成索引,以及重複標籤

set_index('name') 將 name 欄用作列標籤,預設從一般資料欄移除它。 這只改變如何查找列,不會把車名變成唯一識別碼:同一名稱仍可能出現多次。

使用車名作為列標籤
Auto_re = Auto.set_index('name') Auto_re
來源:Ch02-statlearn-lab-zh.ipynb
同一標籤可選到多列
Auto_re.loc['ford galaxie 500', ['mpg', 'origin']]
預期輸出
                   mpg  origin
name                          
ford galaxie 500  15.0       1
ford galaxie 500  14.0       1
ford galaxie 500  14.0       1
來源:Ch02-statlearn-lab-zh.ipynb

loc 使用標籤,回傳一列或多列取決於標籤是否重複與索引寫法。 iloc 仍依位置取資料。需要回到一般欄位時使用 reset_index()。

PART 03 · 遺漏值

Auto 的 horsepower 為什麼是字串?397 筆怎麼變成 392 筆 課程 Lab Ch2 · lab 範例

課程 lab 讀進 Auto 之後, horsepower 那一欄整欄是字串,因為原始檔用 ? 代表遺漏,pandas 看到問號就把整欄當成文字。這種錯誤不會報錯,只會讓你後面算出來的東西全錯。

›按「單步」看整件事怎麼發生、怎麼修。
課程/lab 資料
四個步驟
按「單步」走一次:發現整欄是字串 → 找出影響型別的值是 ? → 在讀檔時就宣告它是遺漏 → 決定要不要 dropna。
目前
步驟0 / 4
horsepower 的型別object(字串)
列數397
為什麼要在讀檔時處理
讀進來之後才發現,你得自己寫 replace 再 astype(float),很容易漏掉某些欄。na_values=['?'] 一次解決,而且下次重跑也不會忘。
找出影響型別的值
np.unique(Auto['horsepower'])

全部是帶引號的字串,輸出末尾就會看到那個 '?'。整欄因此被讀成 object。

來源:Ch02-statlearn-lab-zh.ipynb
讀檔時就宣告哪些字算遺漏
Auto = pd.read_csv(os.path.join(DATA_PATH,'Auto.data'), na_values=['?'], sep=r"\s+") Auto['horsepower'].sum()
預期輸出
np.float64(40952.0)

加上 na_values=['?'] 之後,sum() 才算得出數字。那個 np.float64 就是證據。

來源:Ch02-statlearn-lab-zh.ipynb
dropna:397 變成 392
Auto.shape Auto_new = Auto.dropna() Auto_new.shape
預期輸出
(397, 9)
(392, 9)

整門課後面用的 Auto 都是這 392 筆。你在課本裡看到的 n=392 就是從這裡來的。

來源:Ch02-statlearn-lab-zh.ipynb
延伸:重新索引產生的缺值
reindex 也會生出 NaN
# 欄位選取與資料清理/轉換;排序/重建索引 obj2 = obj.reindex(["a", "b", "c", "d", "e"]) # Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data. obj2 # pandas primarily uses the value np.nan to represent missing data. It is by default not included in computations. Check dropna(), fillna() and isna()
預期輸出
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64

索引裡多了一個 e,原本沒有這一筆,pandas 就填 NaN。遺漏值不是只有讀檔會產生。

來源:Ch01-lab-zh.ipynb
做法什麼時候用風險
na_values=[…](讀檔時)原始檔用特殊符號表示遺漏幾乎沒有,應該是預設動作
dropna()遺漏很少、而且看起來是隨機遺漏遺漏不是隨機時會產生偏差
fillna(中位數)想保留樣本數低估變異、稀釋相關性
當成一個類別(遺漏指示變數)「有沒有填」本身可能幫助預測不能單靠指示變數修正非隨機遺漏的偏差
PART 03 · 自我檢測

Auto['horsepower'].mean() 在沒有加 na_values=['?'] 的情況下會發生什麼?

(A) 報錯或算出無意義的結果,因為整欄是字串
(B) 自動忽略問號,算出正確的平均
(C) 把問號當成 0 來算
跨章應用:category 與模型中的類別效果

數字儲存,不代表一定當連續量分析

cylinders 是汽缸數。它以整數儲存,但在比較不同汽缸數的車時,也可以視為類別。 轉為 category 後,各個值成為群組水準,適合畫各組分布或建立類別編碼。

把汽缸數標成類別
Auto.cylinders = pd.Series(Auto.cylinders, dtype='category') Auto.cylinders.dtype
預期輸出
CategoricalDtype(categories=[3, 4, 5, 6, 8], ordered=None, categories_dtype=int64)
來源:Ch02-statlearn-lab-zh.ipynb

型態轉換不會決定研究問題;是否把汽缸數當連續效應、順序效果或類別效果,仍須依模型與問題選擇。 不要因為類別代碼是 0、1、2,就自動把代碼間距當成測量距離。

PART 04 · 分組彙總

拆分 → 套用 → 合併:groupby 的三個動作 課程 Lab Ch1 · lab 範例

groupby 用來分組彙總,可以分成三個步驟: 拆分(照某一欄的值把列分堆)→ 套用(每一堆各算一次)→ 合併(把結果疊回一張表)。看懂這三步,所有變形都是同一件事。

›按「單步」把 groupby 拆成三個動作看。
課程/lab 資料
三個動作
按「單步」看拆分、套用、合併。注意分組的鍵會變成新的索引——這就是為什麼結果只剩兩列。
目前
步驟0 / 3
組數—
結果形狀—
numeric_only=True 是什麼
有些欄是字串,加總沒有意義。sum(numeric_only=True) 明講「只算數值欄」,若未限定欄位,字串也可能被加總成串接結果,而且不一定會警告。
先數一數每一類有幾筆
# 分組彙總/類別計數 df['A'].value_counts()
預期輸出
A
foo    5
bar    3
Name: count, dtype: int64

value_counts() 是拿到類別欄的第一個動作。某一類只有兩三筆的話,後面做分類會很吃力。

來源:Ch01-lab-zh.ipynb
拆分 → 套用 → 合併
# 分組彙總/類別計數 df.groupby("A").sum(numeric_only=True)
預期輸出
            C         D
A                      
bar  1.747047  2.499340
foo -2.740490  0.700964

A 從一般的欄變成了索引,所以輸出裡它單獨一行、下面是 bar 與 foo。

來源:Ch01-lab-zh.ipynb
圖表需要連網載入 Chart.js:foo 那一組的 C 欄總和是負的、bar 是正的——分組之後兩組的方向相反。
›bar 與 foo 兩組在 C 欄的方向相反。
課程/lab 資料
同一份結果換一種看法
上面那張表的四個數字畫成長條圖。分組彙總之後先畫圖再下結論,數字表很容易看漏正負號。
這些數字哪裡來的
逐字取自 lab 範例 的輸出,沒有重跑。本站所有圖表的數字都可以這樣追回來源。
PART 04 · 自我檢測

df.groupby('A').sum() 之後,欄 A 跑去哪了?

(A) 還在,只是移到最後一欄
(B) 被刪掉了,因為字串不能加總
(C) 變成結果的索引
PART 05 · 串接與讀寫

concat 把切開的表接回去;讀檔的參數決定後面有多痛 課程 Lab Ch1 · lab 範例

這節整理串接與讀檔的用法。上一節的 ? 影響欄位型別,提醒我們 讀檔時先確認分隔符與遺漏值設定。

查看完整分塊與中間輸出
切成三塊再接回去
pieces = [df[:2], df[2:4], df[4:]] pieces, type(pieces[0])
預期輸出
([                   A         B         C         D
  2025-09-01 -0.397297 -1.061537  1.455216  0.632237
  2025-09-02 -0.840037 -1.592677 -0.604842 -1.500806,
                     A         B         C         D
  2025-09-03  0.501820 -0.662466  0.146713  0.293567
  2025-09-04 -1.060077 -1.010073  0.553983  0.211157,
                     A         B         C         D
  2025-09-05 -0.109702  0.236859 -0.203407  0.695861
  2025-09-06  0.157943 -0.966041  0.844384  1.641228],
 pandas.core.frame.DataFrame)

切片給的是三個 DataFrame,裝在一個串列裡。

來源:Ch01-lab-zh.ipynb
concat 沿著列接起來
# 資料表合併/串接 pd.concat(pieces) # Adding a column to a DataFrame is relatively fast. However, adding a row requires a copy, and may be expensive.
查看完整 Lab 輸出
預期輸出
                   A         B         C         D
2025-09-01 -0.397297 -1.061537  1.455216  0.632237
2025-09-02 -0.840037 -1.592677 -0.604842 -1.500806
2025-09-03  0.501820 -0.662466  0.146713  0.293567
2025-09-04 -1.060077 -1.010073  0.553983  0.211157
2025-09-05 -0.109702  0.236859 -0.203407  0.695861
2025-09-06  0.157943 -0.966041  0.844384  1.641228

接回去之後跟原本一模一樣。注意註解裡那句話:加一欄很快,加一列要複製整張表——所以不要在迴圈裡一列一列 append。

來源:Ch01-lab-zh.ipynb
設定讀檔參數
Auto = pd.read_csv(os.path.join(DATA_PATH,'Auto.data'), na_values=['?'], sep=r"\s+") Auto['horsepower'].sum()
預期輸出
np.float64(40952.0)

sep=r"\s+" 是「一個以上的空白當分隔」,na_values 是「這些字算遺漏」。讀檔時先寫清楚規則,之後較容易核對資料。

來源:Ch02-statlearn-lab-zh.ipynb
›按「單步」把三塊接回去。
課程/lab 資料
疊回去
三塊各自是完整的 DataFrame,欄名一樣,concat 沿著列把它們接起來。
目前
步驟0 / 3
已接上的列數0
axis=1 呢
沿欄接:列索引要對得起來,接完欄變多。對不起來的位置會填 NaN。這是最容易產生意外遺漏值的操作。
觀念釐清
concat 跟 merge 差在哪?
concat 是疊:形狀相容就沿著某個軸接起來,預設沿列(axis=0)。merge 是對:照某個鍵把兩張表配對,像 SQL 的 join。本課的 lab 主要用 concat,但實務上 merge 更常見。
為什麼不要在迴圈裡一列一列加?
DataFrame 的欄是連續存放的,加一列等於整張表複製一次。一萬列就複製一萬次。正確做法是把每一塊放進 Python 串列,最後 pd.concat(串列) 一次接完。
EXERCISES · 練習

動手驗證:概念自測 先備 · 自我檢測

回顧本頁觀念與原 Lab 的程式,確認各個操作的意義與使用條件。

EXERCISE 2 · loc 與 iloc

df 的索引是日期。想拿「第 3 到第 5 列」,正確的寫法是?

(A) df.loc[3:5]
(B) df.iloc[2:5]
(C) df[3:5]
EXERCISE 3 · groupby

想得到「每個 origin 的平均 mpg」,而且結果要是一張有 origin 欄的普通表,怎麼寫?

(A) Auto.groupby('origin', as_index=False)['mpg'].mean()
(B) Auto.groupby('origin')['mpg'].mean()
(C) Auto[['origin', 'mpg']].mean()
重點速查與來源

pandas 資料框速查表 先備 · pandas 資料框

來源:完整書目與章節定位

本頁書目與章節定位

  • 教科書:An Introduction to Statistical Learning with Applications in Python。James、Witten、Hastie、Tibshirani、Taylor,2023。原書與下載資訊

需要核對完整公式、比較表或實作時,再展開下方速查。

查閱完整速查與延伸提醒

三張速查表整理選取語法、資料檢查與分組彙總。

你想做的事寫法拿到什麼
取一欄df['A']Series
取一欄但要 DataFramedf[['A']]DataFrame(一欄)
取幾欄df.loc[:, ['A','C']]DataFrame
取一列(照位置)df.iloc[3]Series(欄名變索引)
取幾列(照位置)df.iloc[1:4]DataFrame,不含第 4
取幾列(照名字)df.loc['a':'c']DataFrame,含 c
用條件選列df[df['A'] > 0]DataFrame
某一格df.loc['a', 'A']純量
拿到新資料的前五分鐘看什麼
df.shape列數欄數跟預期一樣嗎
df.head()欄名對嗎、有沒有整欄空白
df.dtypes該是數字的欄有沒有變成 object
df.describe()範圍合理嗎;count 比列數少就是有 NaN
df['類別欄'].value_counts()有沒有哪一類只有兩三筆
groupby 的三個動作發生什麼
拆分(split)照鍵的值把列分成幾堆
套用(apply)每一堆各算一次彙總函式
合併(combine)把結果疊成一張表,鍵變成索引
三個閱讀重點 1. 拿到資料先看 dtypes。該是數字的欄變成 object,代表原始檔裡有非數字的東西(例如 Auto 的 ?)。
2. loc 靠名字、iloc 靠位置;loc 的切片含尾。
3. groupby 之後鍵會變成索引。要它留在欄裡就 as_index=False 或 reset_index()。
CARDS · 關鍵詞彙卡

關鍵詞彙卡:點卡片翻面 課程詞彙

詞彙卡整理本頁引用的課程 lab中常用的統計或機器學習專有名詞,正面附英文名稱。 先看正面的術語,試著說出定義,再翻面核對。可以洗牌複習,也可以搭配本章例子練習解釋。

複習:展開關鍵詞彙卡