大家好,歡迎來到數據新手村的第十六天!昨天我們認識了 Pandas 的一維資料結構 Series
,可以把它看作是帶有索引標籤的一維陣列。
今天,我們將迎來 Pandas 世界的真正主角——DataFrame
。如果說 Series
是 Excel 中的一「欄」,那麼 DataFrame
就是我們所熟悉的、由多個行和列組成的完整「工作表 (Spreadsheet)」。它是我們未來所有數據分析工作的核心載體。
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
# 延續上方的 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
選取欄 (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.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 中!