什么是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,动手排序和重命名吧~

小夜