什麼是pandas索引(Index)?

在pandas中,索引(Index)就像Excel表格裏的“行號”和“列標題”,是用來標識數據位置和內容的關鍵。比如,當你有一個包含學生信息的表格,左邊的“學號”或“姓名”就是行索引,上面的“科目”“成績”就是列索引。它的作用就像“數據的身份證”,讓我們能快速定位、排序和管理數據。

爲什麼索引很重要?

  1. 快速定位數據:通過索引直接找到對應行/列的數據,不用逐個查找。
  2. 數據排序的基礎:排序時需要根據索引或值重新排列數據。
  3. 數據合併的依據:不同數據框合併時,索引可以作爲匹配的“鑰匙”。

一、數據排序:按索引或值重新排列

pandas中排序分爲兩種:按索引排序(默認按位置)和按值排序(按數據內容)。

1. Series排序(單列數據)

假設我們有一個記錄商品銷量的Series,索引是商品名,值是銷量。

import pandas as pd

# 創建示例Series:索引是商品名,值是銷量
s = pd.Series([50, 30, 80, 20], index=['蘋果', '香蕉', '橙子', '草莓'])
print("原始Series:")
print(s)

輸出:

原始Series
蘋果    50
香蕉    30
橙子    80
草莓    20
dtype: int64
(1)按索引排序(sort_index

按索引(商品名)的字母/中文順序排列:

# 按索引升序排序(默認ascending=True)
sorted_by_index_asc = s.sort_index()
print("\n按索引升序排序後:")
print(sorted_by_index_asc)

# 按索引降序排序(設置ascending=False)
sorted_by_index_desc = s.sort_index(ascending=False)
print("\n按索引降序排序後:")
print(sorted_by_index_desc)

輸出:

按索引升序排序後
草莓    20
蘋果    50
香蕉    30
橙子    80
dtype: int64

按索引降序排序後
橙子    80
香蕉    30
蘋果    50
草莓    20
dtype: int64
(2)按值排序(sort_values

按銷量(值)從小到大或從大到小排列:

# 按值升序排序(默認ascending=True)
sorted_by_value_asc = s.sort_values()
print("\n按銷量升序排序後:")
print(sorted_by_value_asc)

# 按值降序排序(設置ascending=False)
sorted_by_value_desc = s.sort_values(ascending=False)
print("\n按銷量降序排序後:")
print(sorted_by_value_desc)

輸出:

按銷量升序排序後
草莓    20
香蕉    30
蘋果    50
橙子    80
dtype: int64

按銷量降序排序後
橙子    80
蘋果    50
香蕉    30
草莓    20
dtype: int64

2. DataFrame排序(多列數據)

DataFrame是二維表格,排序可以按行索引(默認)或列值(指定列)。
假設我們有一個學生成績表:

# 創建示例DataFrame:索引是學生姓名,列是科目和分數
df = pd.DataFrame({
    '語文': [85, 78, 92],
    '數學': [90, 82, 88],
    '英語': [75, 90, 85]
}, index=['小明', '小紅', '小剛'])
print("原始DataFrame:")
print(df)

輸出:

原始DataFrame:
    語文  數學  英語
小明  85  90  75
小紅  78  82  90
小剛  92  88  85
(1)按列值排序(sort_values

比如按“語文”成績升序排列:

# 按“語文”列升序排序
df_sorted = df.sort_values(by='語文')
print("\n按語文成績升序排序後:")
print(df_sorted)

輸出:

按語文成績升序排序後:
    語文  數學  英語
小紅  78  82  90
小明  85  90  75
小剛  92  88  85
(2)按行索引排序(sort_index

按行索引(學生姓名)的字母順序排列:

# 按行索引降序排序(中文按拼音順序,'小剛' > '小紅' > '小明')
df_sorted_index = df.sort_index(ascending=False)
print("\n按行索引降序排序後:")
print(df_sorted_index)

輸出:

按行索引降序排序後:
    語文  數學  英語
小剛  92  88  85
小明  85  90  75
小紅  78  82  90

二、重命名索引:修改行/列標籤

有時候默認的索引(如0,1,2或中文姓名)不夠直觀,我們可以手動重命名行索引或列索引。

1. 重命名行索引(rename方法)

假設我們想把學生姓名換成“第一組”“第二組”等更簡潔的標籤:

# 重命名行索引(原索引:小明、小紅、小剛 → 新索引:第一組、第二組、第三組)
df_renamed = df.rename(index={'小明': '第一組', '小紅': '第二組', '小剛': '第三組'})
print("\n重命名行索引後:")
print(df_renamed)

輸出:

重命名行索引後:
      語文  數學  英語
第一組  85  90  75
第二組  78  82  90
第三組  92  88  85

2. 重命名列索引(rename方法)

如果想把“語文”“數學”等列名改成更易懂的“Chinese”“Math”,可以這樣做:

# 重命名列索引(原列名:語文、數學、英語 → 新列名:Chinese、Math、English)
df_renamed_cols = df.rename(columns={'語文': 'Chinese', '數學': 'Math', '英語': 'English'})
print("\n重命名列索引後:")
print(df_renamed_cols)

輸出:

重命名列索引後:
      Chinese  Math  English
小明        85    90       75
小紅        78    82       90
小剛        92    88       85

3. 直接修改索引(inplace參數)

如果希望直接修改原數據(而非生成新數據),可以用inplace=True

# 直接修改列名(原列名:語文、數學、英語 → 新列名:語文、數學、英語)
df.columns = ['語文', '數學', '英語']  # 直接賦值,需確保新列名數量和原列數一致
print("\n直接修改列名後:")
print(df)

# 直接修改行索引(原行索引:小明、小紅、小剛 → 新行索引:1、2、3)
df.index = [1, 2, 3]
print("\n直接修改行索引後:")
print(df)

三、注意事項

  1. 區分行/列索引df.index是行索引,df.columns是列索引,排序和重命名時需明確。
  2. 保持索引長度一致:修改索引時,新索引列表的長度必須和原數據行數/列數相同,否則會報錯。
  3. inplace參數:默認inplace=False,生成新數據不修改原數據;設爲True則直接修改原數據(謹慎使用!)。

總結

索引是pandas數據處理的核心工具,掌握排序(按索引/值)和重命名(行/列)能幫你更高效地管理數據。通過多練習簡單示例(如本文中的學生成績表),你會很快熟悉這些操作!

現在就打開Python編輯器,跟着代碼嘗試創建自己的DataFrame,動手排序和重命名吧~

小夜