National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 04

DataFrame

讀 CSV,看 shape、head、info 與 dtypes
Interaction實作 30 minute(s)

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 讀入的日期

兩個要特別注意的情況:

  1. 缺值讓整數欄變成 float64。缺值 NaN 是小數,整欄只能存成小數;這不是資料錯了。
  2. 型別不對,後面的計算就不對。日期讀成文字(object)時,不能算相差幾天、不能依月份分組; 分數欄混進「85分」「缺考」這種文字,整欄會變成 object,連平均都算不出來(第 8 課處理)。 所以 info() 或 dtypes 是每次讀資料都要看的。

日期欄可以在讀入時指定:pd.read_csv("weather.csv", parse_dates=["date"])。

逐步看:日期欄讀成文字,再讀成日期

weather.csv 是模擬的每日天氣(9 月到 12 月)。比較兩次讀入時 date 欄的 dtype。

實作:學生資料的第一眼

讀入 students.csv,依序印出:

  1. 資料表的 shape
  2. 所有欄名,轉成串列(tolist())
  3. 通勤時間 commute_min 的平均,四捨五入到小數 1 位
你的輸出
預期輸出

小測驗:資料表與 dtype

1.

grades.shape 是 (600, 5),代表什麼?

2.

grades.csv 的期中成績都是整數分數,為什麼 midterm 的 dtype 是 float64?

3.

下面程式會印出什麼?

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)))
4.

grades.info() 顯示 midterm 是「587 non-null」,資料表共 600 列。這代表什麼?

5.

weather.csv 的 date 欄讀進來是 object。想比較日期先後、依月份分組,最直接的做法是?

第 1 次作答

重點整理

  • 資料表(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。
這一課完成了!
Next lesson:選取資料
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。