一、Pandas 的 Index(索引)是什么?
Pandas 的 Index 就像是 Excel 表格的行號 + 列標題,或者書的目錄。
核心作用:
- 定位數據:就像 Excel 中用行號和列名定位單元格(如 A1、B2),Pandas 用 Index 快速找到數據。
- 對齊數據:當你合并或操作多個表格時,Index 能自動對齊相同標簽的數據。
- 分組與聚合:類似 Excel 的篩選和分類匯總,Index 可以按標簽分組數據。
關鍵特點:
- 標簽化:可以是數字(如 0,1,2...)、字符串(如 'A','B','C')、日期(如 2023-01-01)等。
- 靈活層級:支持多級索引(類似 Excel 的合并單元格),例如按 "年 + 月" 分層。
- 不強制唯一:Index 標簽可以重復(但查詢時會返回多行)。
舉個栗子:
import pandas as pd # 創建一個DataFrame,指定Index為水果名稱 df = pd.DataFrame({ ??? '價格': [5, 3, 8], ??? '庫存': [100, 200, 150] }, index=['蘋果', '香蕉', '草莓']) # 通過Index查詢數據(類似Excel按行標題篩選) print(df.loc['蘋果'])? # 輸出蘋果的價格和庫存 |
二、Pandas Index vs SQL Index(核心區別)
對比項 | Pandas Index | SQL Index |
作用 | 標識 + 定位數據,類似 Excel 行號 / 列名 | 優化查詢速度,類似書的索引頁 |
是否必需 | 必須有(默認創建 RangeIndex:0,1,2...) | 可選(不創建時按全表掃描) |
唯一性 | 標簽可重復(除非顯式設置verify_integrity=True) | 主鍵索引必須唯一,普通索引可重復 |
數據結構 | 類似有序字典,支持快速標簽查找 | B 樹、哈希表等高效索引結構 |
使用場景 | 數據篩選、對齊、分組(如df.loc['蘋果']) | 加速 WHERE 條件查詢(如WHERE id = 1) |
創建方式 | 顯式指定(如index=['A','B'])或自動生成 | 通過CREATE INDEX語句創建 |
對增刪改的影響 | 增刪改時自動維護 Index | 增刪改時需額外維護索引(可能影響性能) |
三、對比
1. 定位數據的邏輯
- Pandas:類似在 Excel 中用行標題和列標題找數據。
df.loc['蘋果', '價格']? # 直接按標簽查詢 |
- SQL:類似在數據庫表中用 WHERE 條件過濾。
SELECT 價格 FROM fruits WHERE 名稱 = '蘋果';? # 通過條件篩選 |
2. 索引的「強制性」
- Pandas:必須有 Index,即使你不指定,也會自動生成RangeIndex(0,1,2...)。
- SQL:可以沒有索引,但查詢會變慢(全表掃描)。
3. 唯一性約束
- Pandas:Index 標簽默認可重復。
df = pd.DataFrame([1,2], index=['A','A'])? # 合法 |
- SQL:主鍵索引必須唯一,普通索引可重復。
CREATE UNIQUE INDEX idx_id ON users(id);? # 唯一約束 |
4. 多級索引的騷操作
- Pandas:支持類似 Excel 合并單元格的多級索引。
# 按[年份, 月份]分層 df = pd.DataFrame( ? {'銷售額': [100, 200]}, ? index=pd.MultiIndex.from_tuples([(2023, 1), (2023, 2)]) ) |
- SQL:需要用多個字段組合索引(復合索引)。
CREATE INDEX idx_year_month ON sales(year, month); |
四、何時該用誰?
場景 | 用 Pandas Index | 用 SQL Index |
交互式數據分析 | ? 直接按標簽篩選、分組 | ? 需寫 SQL 語句,不夠靈活 |
處理帶層次結構的數據 | ? 多級索引天然支持 | ? 需 JOIN 多個表 |
優化大數據查詢性能 | ? Pandas 基于內存,索引優化有限 | ? SQL 索引對 TB 級數據效果顯著 |
保證數據唯一性 | ? 需手動檢查 | ? 主鍵約束自動保證 |
五、總結
- Pandas Index是數據的固有組成部分,用于標簽化訪問和對齊,類似 Excel 的行號 / 列名。
- SQL Index是查詢的加速工具,通過額外的數據結構優化 WHERE 條件,類似書的索引頁。
我們習慣了 SQL 索引的優化路徑,在 Pandas 中更應該關注如何設計合理的 Index 標簽(如用日期、ID 作為 Index),而不是追求查詢速度的優化(Pandas 的性能瓶頸主要在內存,而非索引)。