iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
自我挑戰組

數據新手村:統計系畢業生 30 天打怪升級之旅系列 第 16

Day 16 - Pandas DataFrame 的創建與資料存取

  • 分享至 

  • xImage
  •  

大家好,歡迎來到數據新手村的第十六天!昨天我們認識了 Pandas 的一維資料結構 Series,可以把它看作是帶有索引標籤的一維陣列。

今天,我們將迎來 Pandas 世界的真正主角——DataFrame。如果說 Series 是 Excel 中的一「欄」,那麼 DataFrame 就是我們所熟悉的、由多個行和列組成的完整「工作表 (Spreadsheet)」。它是我們未來所有數據分析工作的核心載體。


1. 創建 DataFrame

DataFrame 是一個二維的、帶有標籤的資料結構,它的每一欄都可以是不同的資料類型。創建它最常見的方式,是透過 Python 的字典 (Dictionary)。

import pandas as pd

# 使用字典來創建 DataFrame
# 字典的 key 會成為欄位名稱 (columns)
# 字典的 value (一個 list) 會成為該欄位的內容
data = {
    '姓名': ['小明', '小華', '小李'],
    '科目': ['數學', '英文', '自然'],
    '分數': [85, 92, 78]
}

df = pd.DataFrame(data)

print(df)

輸出結果:
姓名 科目 分數
0 小明 數學 85
1 小華 英文 92
2 小李 自然 78

  1. DataFrame 的核心屬性
    和 Series 類似,DataFrame 也有一些重要的屬性,可以幫助我們快速了解它的結構。

# 延續上方的 df
print(f"索引 (Index): {df.index}")
print(f"欄位 (Columns): {df.columns}")
print(f"值 (Values):\n{df.values}") # 注意,回傳的是一個 NumPy ndarray
print(f"形狀 (Shape): {df.shape}") # (列數, 欄數)
print(f"各欄位資料類型 (dtypes):\n{df.dtypes}")

輸出結果:
[['小明' '數學' 85]
['小華' '英文' 92]
['小李' '自然' 78]]
形狀 (Shape): (3, 3)
各欄位資料類型 (dtypes):
姓名 object
科目 object
分數 int64
dtype: object

  1. 資料存取 (Data Access) - 本篇核心
    如何從 DataFrame 中精準地取出我們想要的資料?Pandas 提供了非常靈活的選取方式。

選取欄 (Column)
這是最常見的操作。

# 選取單一欄位,回傳一個 Series
scores_series = df['分數']
print(f"「分數」這一欄的類型是: {type(scores_series)}")
print(scores_series)

print("-" * 20)

# 選取多個欄位,注意要用兩層中括號 [[]],回傳一個 DataFrame
name_score_df = df[['姓名', '分數']]
print(f"「姓名」和「分數」這兩欄的類型是: {type(name_score_df)}")
print(name_score_df)

輸出結果:
「分數」這一欄的類型是: <class 'pandas.core.series.Series'>
0 85
1 92
2 78
Name: 分數, dtype: int64

「姓名」和「分數」這兩欄的類型是: <class 'pandas.core.frame.DataFrame'>
姓名 分數
0 小明 85
1 小華 92
2 小李 78

選取列 (Row) - loc vs. iloc
.loc: 基於標籤 (label) 的索引。

.iloc: 基於位置 (integer position) 的索引 (從 0 開始)。

# 建立一個索引為 A, B, C 的 DataFrame
df_labeled = pd.DataFrame(data, index=['A', 'B', 'C'])
print(f"帶有標籤的 DataFrame:\n{df_labeled}\n")

# 使用 loc 透過「標籤」選取第二列
print(f"使用 loc['B'] 選取的列:\n{df_labeled.loc['B']}\n")

# 使用 iloc 透過「位置」選取第二列
print(f"使用 iloc[1] 選取的列:\n{df_labeled.iloc[1]}")

輸出結果:
帶有標籤的 DataFrame:
姓名 科目 分數
A 小明 數學 85
B 小華 英文 92
C 小李 自然 78

使用 loc['B'] 選取的列:
姓名 小華
科目 英文
分數 92
Name: B, dtype: object

使用 iloc[1] 選取的列:
姓名 小華
科目 英文
分數 92
Name: B, dtype: object

選取單一值 (精準定位)
我們可以結合列與欄的索引,來定位到任何一個儲存格的值。

# 選取索引為 'B' 的列,'科目' 這一欄的值
value = df_labeled.loc['B', '科目']
print(f"B 同學的科目是: {value}")

輸出結果:
B 同學的科目是: 英文


結語
今天我們掌握了 Pandas 最核心的物件 DataFrame。我們學會了如何創建它、檢視它的基本屬性,以及如何透過 [], .loc, .iloc 來存取其中的任何資料。

既然我們已經了解了 DataFrame 的結構,是時候停止創建這些玩具範例,開始處理真實世界的數據了。明天,Day 17,我們將學習如何從 CSV 檔案中,將我們的 Olist 數據集載入到 DataFrame 中!


上一篇
Day 15 - Pandas 登場與 Series 詳解
系列文
數據新手村:統計系畢業生 30 天打怪升級之旅16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言