现在位置: 首页 > Pandas 教程 > 正文

Pandas df.rename() 函数

Pandas 常用函数 Pandas 常用函数


df.rename() 是 Pandas 中用于重命名 DataFrame 的列名或索引的函数。

在数据分析中,清晰的列名和索引对于代码的可读性和维护性非常重要。rename() 允许你灵活地修改列名和索引名称,使数据更加规范和易于理解。这在数据导入、清洗和报告生成时特别有用。


基本语法与参数

rename() 是 DataFrame 的成员函数,通过点运算符 . 来调用。

语法格式

DataFrame.rename(mapper=None, index=None, columns=None, axis=None, inplace=False, errors='ignore')

参数说明

参数 类型 是否必填 说明 默认值
mapper dict 或 function 可选 用于重命名轴(行索引或列名)的映射规则。可以是字典或函数。与 axis 参数配合使用。 None
index dict 或 function 可选 直接指定行索引的重命名规则。优先于 mapperaxis None
columns dict 或 function 可选 直接指定列名的重命名规则。优先于 mapperaxis None
axis int 或 str 可选 指定要重命名的轴。0'index' 表示行索引;1'columns' 表示列名。 None
inplace bool 可选 如果为 True,直接在原 DataFrame 上修改,不返回新对象;如果为 False,返回一个新的 DataFrame,原数据不变。 False
errors str 可选 控制错误处理。'raise' 表示找不到对应的键时抛出异常;'ignore' 表示忽略不存在的键。 'ignore'

返回值说明

  • 返回一个新的 DataFrame(如果 inplace=False),或者 None(如果 inplace=True)。
  • 返回的 DataFrame 中列名或索引已被重命名。

实例

让我们通过一系列例子,彻底掌握 rename() 的用法。

示例 1:重命名列名

使用 columns 参数可以方便地重命名列名。

实例

import pandas as pd

# 创建一个 DataFrame
data = {
    'name': ['张三', '李四', '王五'],
    'age': [25, 30, 35],
    'salary': [5000, 6000, 7000]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 使用字典重命名列名
df_renamed = df.rename(columns={
    'name': '姓名',
    'age': '年龄',
    'salary': '薪资'
})

print("重命名列名后的数据:")
print(df_renamed)

运行结果预期:

原始数据:
   name  age  salary
0  张三   25   5000
1  李四   30   6000
2  王五   35   7000
==================================================
重命名列名后的数据:
    姓名  年龄   薪资
0  张三   25  5000
1  李四   30  6000
2  王五   35  7000

代码解析:

  1. 原始数据的列名是英文,我们使用字典将它们重命名为中文。
  2. 使用 columns 参数只影响列名,不影响行索引。
  3. 这是一种常见的数据规范化操作。

示例 2:重命名行索引

使用 index 参数可以重命名行索引。

实例

import pandas as pd

# 创建一个 DataFrame,使用默认索引
data = {
    '水果': ['苹果', '香蕉', '橙子'],
    '数量': [10, 20, 15]
}
df = pd.DataFrame(data)

print("原始数据(默认索引):")
print(df)
print("=" * 50)

# 使用字典重命名行索引
df_renamed = df.rename(index={
    0: '第一行',
    1: '第二行',
    2: '第三行'
})

print("重命名行索引后的数据:")
print(df_renamed)

运行结果预期:

原始数据(默认索引):
   水果  数量
0  苹果  10
1  香蕉  20
2  橙子  15
==================================================
重命名行索引后的数据:
     水果  数量
第一行   苹果  10
第二行   香蕉  20
第三行   橙子  15

代码解析:

  • 原始数据的行索引是 0、1、2 这样的数字。
  • 使用 index 参数可以将它们重命名为更有意义的名称。
  • 这在生成报告时特别有用。
  • 示例 3:同时重命名列名和行索引

    可以一次性重命名列名和行索引。

    实例

    import pandas as pd

    # 创建一个 DataFrame
    data = {
        'A': [1, 2, 3],
        'B': [4, 5, 6]
    }
    df = pd.DataFrame(data, index=['x', 'y', 'z'])

    print("原始数据:")
    print(df)
    print("=" * 50)

    # 同时重命名列名和行索引
    df_renamed = df.rename(columns={'A': '列A', 'B': '列B'}, index={'x': '行X', 'y': '行Y', 'z': '行Z'})

    print("重命名后的数据:")
    print(df_renamed)

    运行结果预期:

    原始数据:
       A  B
    x  1  4
    y  2  5
    z  3  6
    ==================================================
    重命名后的数据:
        列A  列B
    行X   1   4
    行Y   2   5
    行Z   3   6
    

    代码解析:

    • 可以同时使用 columnsindex 参数。
    • 这在数据导入和标准化时非常方便。
    • 示例 4:使用函数重命名

      rename() 也接受函数作为参数,可以对列名或索引进行批量转换。

      实例

      import pandas as pd

      # 创建一个列名比较复杂的 DataFrame
      data = {
          'USER_NAME': ['张三', '李四'],
          'USER_AGE': [25, 30],
          'USER_SALARY': [5000, 6000]
      }
      df = pd.DataFrame(data)

      print("原始数据:")
      print(df)
      print("=" * 50)

      # 使用函数将列名转为小写
      df_lower = df.rename(columns=str.lower)

      print("列名转小写后:")
      print(df_lower)
      print("=" * 50)

      # 使用函数去除前缀(如 USER_)
      df_clean = df.rename(columns=lambda x: x.replace('USER_', ''))

      print("去除前缀后:")
      print(df_clean)
      print("=" * 50)

      # 使用函数添加前缀
      df_prefix = df.rename(columns=lambda x: 'col_' + x)

      print("添加前缀后:")
      print(df_prefix)

      运行结果预期:

      原始数据:
        USER_NAME  USER_AGE  USER_SALARY
      0       张三       25       5000
      1       李四       30       6000
      列名转小写后:
        user_name  user_age  user_salary
      0       张三       25       数据清洗
      1       李四       30       6000
      ==================================================
      去除前缀后:
        NAME  AGE  SALARY
      0  张三   25  5000
      1  李四   30  6000
      

      代码解析:

      • str.lower 是字符串的转小写方法。
      • 使用 lambda 函数可以灵活处理复杂的命名规则。
      • 这种方法适合批量处理大量列名。
      • 示例 5:使用 inplace 参数原地修改

        使用 inplace=True 可以直接在原 DataFrame 上修改,而不返回新对象。

        实例

        import pandas as pd

        # 创建一个 DataFrame
        data = {
            'name': ['张三', '李四'],
            'age': [25, 30]
        }
        df = pd.DataFrame(data)

        print("原始数据:")
        print(df)
        print(f"原始数据 id: {id(df)}")
        print("=" * 50)

        # 使用 inplace=True 原地修改
        df.rename(columns={'name': '姓名', 'age': '年龄'}, inplace=True)

        print("使用 inplace=True 修改后的数据:")
        print(df)
        print(f"修改后数据 id: {id(df)}")

        运行结果 expected:

        原始数据:
           name  age
        0  张三   25
        1  李四   30
        原始数据 id: 140234567890
        ==================================================
        使用 inplace=True 修改后的数据:
            姓名  年龄
        0  张三   25
        1  李四   30
        修改后数据 id: 140234567890  # 同一个对象
        

        代码解析:

        • 使用 inplace=True 后,DataFrame 的内存地址(id)不变,说明是原地修改。
        • 这种方法可以节省内存,特别是处理大型数据集时。
        • 示例 6:处理不存在的列名

          使用 errors 参数可以控制当列名不存在时的行为。

          实例

          import pandas as pd

          # 创建一个 DataFrame
          data = {
              'A': [1, 2, 3],
              'B': [4, 5, 6]
          }
          df = pd.DataFrame(data)

          print("原始数据:")
          print(df)
          print("=" * 50)

          # 尝试重命名一个不存在的列,使用 errors='ignore'(默认)
          df_renamed = df.rename(columns={'C': 'C_new'})  # C 列不存在

          print("重命名不存在的列(C),使用默认行为:")
          print(df_renamed)  # 不会有任何改变
          print("=" * 50)

          # 尝试重命名一个不存在的列,使用 errors='raise'
          try:
              df_renamed2 = df.rename(columns={'C': 'C_new'}, errors='raise')
          except KeyError as e:
              print(f"抛出异常: {e}")

          运行结果预期:

          原始数据:
             A  B
          0  1  4
          1  2  5
          2  3  6
          ==================================================
          重命名不存在的列(C),使用默认行为:
             A  B
          0  1  4
          1  2  5
          2  3  6  # 无变化
          ==================================================errors
          ==================================================
          抛出异常: 'C'
          

          代码解析:

          • 默认情况下(errors='ignore'),如果列不存在,不会有任何改变,也不会报错。
          • 如果设置 errors='raise',会抛出 KeyError 异常。
          • 示例 7:使用 axis 参数

            使用 axis 参数可以更灵活地指定重命名的轴。

            实例

            import pandas as pd

            # 创建一个 DataFrame
            data = {
                'col1': [1, 2, 3],
                'col2': [4, 5, 6]
            }
            df = pd.DataFrame(data, index=['row1', 'row2', 'row3'])

            print("原始数据:")
            print(df)
            print("=" * 50)

            # 使用 axis='columns' 重命名列
            df_renamed_cols = df.rename({'col1': '第一列', 'col2': '第二列'}, axis='columns')

            print("使用 axis='columns' 重命名列后:")
            print(df_renamed_cols)
            print("=" * 50)

            # 使用 axis='index' 重命名行索引
            df_renamed_idx = df.rename({'row1': '第一行', 'row2': '第二行', 'row3': '第三行'}, axis='index')

            print("使用 axis='index' 重命名行后:")
            print(df_renamed_idx)

            运行结果预期:

            原始数据:
                  col1  col2
            row1     1     4
            row2     2     5
            row3     3     6
            ==================================================
            使用 axis='columns' 重命名列后:
                  第一列  第二列
            row1     1     4
            row2     2     5
            row3     3     6
            

            代码解析:

            • axis='columns'axis=1 表示操作列。
            • axis='index'axis=0 表示操作行索引。
            • 这种语法与 NumPy 的风格一致。

            • 注意事项

              • rename() 默认不会修改原始 DataFrame,如果想原地修改,使用 inplace=True 参数。
              • 优先使用 columnsindex 参数,而不是 mapperaxis,因为前者更清晰易懂。
              • 使用函数重命名时,要确保函数返回字符串类型,否则可能会引发错误。
              • 在处理大型数据集时,使用 inplace=True 可以节省内存。
              • 重命名之前,建议先检查当前的列名,可以使用 df.columns 查看。

              Pandas 常用函数 Pandas 常用函数