Learning Objectives
- 說出資料表(DataFrame)的列、欄、索引與欄名,以及「每一欄是一個 Series」
- 用 read_csv 讀入 CSV,用 shape、head、tail、info、describe 做初步檢查
- 讀懂每一欄的 dtype,說明為什麼有缺值的整數欄會變成 float64
- 用 parse_dates 把日期欄讀成日期型別
資料表:很多欄並排
大部分要分析的資料都長得像試算表:一列是一個觀察單位(第 1 課),一欄是一個變數。 pandas 用資料表(DataFrame)表示這種資料:
- 列(row)有索引(index),預設是 0、1、2……
- 欄(column)有欄名,例如
student_id、dept - 每一欄是一個 Series(第 3 課),所有欄共用同一個索引;每一欄有自己的
dtype,所以同一張表可以同時有文字欄與數字欄
拿到一份新資料,先花幾分鐘看清楚它的樣子,比直接開始算重要。這一課介紹讀入 CSV 之後的「第一眼檢查」。
逐步看:從字典建立一張小表
右邊記憶體區畫出資料表的每一格。注意第 14 行取出一欄後,col 變成一個 Series。
讀入 CSV 後的第一眼檢查
pd.read_csv("檔名") 讀入 CSV,第一列當欄名。讀進來之後,依序回答幾個問題:
| 問題 | 方法 | 看什麼 |
|---|---|---|
| 有多大? | df.shape |
列數、欄數,和預期的一樣嗎? |
| 長什麼樣子? | df.head()、df.tail() |
前 5 列、後 5 列(可以給數字,如 head(3));欄位的意思、寫法 |
| 每一欄是什麼型別?有缺值嗎? | df.info() |
每一欄的非缺值筆數(non-null count)與 dtype |
| 數值欄的範圍合理嗎? | df.describe() |
筆數、平均、標準差、最小、四分位數、最大;有沒有不可能的值 |
info() 會直接印出結果(不用再 print),最後一行的記憶體用量在不同電腦上可能不一樣,不必在意。
describe() 預設只描述數值欄,count 比列數少就表示那一欄有缺值。
逐步看:成績資料的第一眼檢查
grades.csv 是程式產生的模擬資料(600 筆修課成績),不是任何學校的真實資料。注意 info 裡期中考(midterm)的筆數。
dtype:每一欄是什麼型別
常見的 dtype:
| dtype | 存什麼 | 例子 |
|---|---|---|
int64 |
整數 | 年級、缺席次數 |
float64 |
小數,也包括有缺值的整數欄 | 讀書時數、有人缺考的期中成績 |
object |
文字(以及混雜的內容) | 學號、系所、還沒轉換的日期 |
bool |
True/False | 篩選條件的結果 |
datetime64[ns] |
日期與時間 | 用 parse_dates 讀入的日期 |
兩個要特別注意的情況:
- 缺值讓整數欄變成 float64。缺值 NaN 是小數,整欄只能存成小數;這不是資料錯了。
- 型別不對,後面的計算就不對。日期讀成文字(
object)時,不能算相差幾天、不能依月份分組; 分數欄混進「85分」「缺考」這種文字,整欄會變成object,連平均都算不出來(第 8 課處理)。 所以info()或dtypes是每次讀資料都要看的。
日期欄可以在讀入時指定:pd.read_csv("weather.csv", parse_dates=["date"])。
逐步看:日期欄讀成文字,再讀成日期
weather.csv 是模擬的每日天氣(9 月到 12 月)。比較兩次讀入時 date 欄的 dtype。
實作:學生資料的第一眼
讀入 students.csv,依序印出:
- 資料表的
shape - 所有欄名,轉成串列(
tolist()) - 通勤時間
commute_min的平均,四捨五入到小數 1 位
小測驗:資料表與 dtype
grades.shape 是 (600, 5),代表什麼?
grades.csv 的期中成績都是整數分數,為什麼 midterm 的 dtype 是 float64?
下面程式會印出什麼?
import pandas as pd
df = pd.DataFrame({"a": [1, 2, 3], "b": ["x", "y", "z"], "c": [0.5, 1.5, 2.5]})
print(df.shape, list(df.dtypes.astype(str)))
grades.info() 顯示 midterm 是「587 non-null」,資料表共 600 列。這代表什麼?
weather.csv 的 date 欄讀進來是 object。想比較日期先後、依月份分組,最直接的做法是?
重點整理
- 資料表(DataFrame)有列索引與欄名;每一欄是一個 Series,有自己的 dtype。
- 讀入 CSV:
pd.read_csv("檔名");第一眼檢查:shape、head()/tail()、info()、describe()。 info()的非缺值筆數比列數少,就是有缺值;describe()看數值範圍合不合理。- 常見 dtype:
int64、float64、object(文字)、bool、datetime64。有缺值的整數欄會變成float64;日期要用parse_dates才是日期型別。 - 下一課學怎麼從資料表選取需要的欄與列:
loc、iloc、布林篩選與query。