Pandas 重新命名

在資料處理過程中,經常需要重新命名欄位或索引,讓資料更易讀或符合後續處理需求。

範例資料

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': [4, 5, 6],
    'col3': [7, 8, 9]
}, index=['a', 'b', 'c'])

重新命名欄位

使用 rename()

# 重新命名特定欄位
df_renamed = df.rename(columns={'col1': 'A', 'col2': 'B'})
print(df_renamed)
   A  B  col3
a  1  4     7
b  2  5     8
c  3  6     9

重新命名所有欄位

# 直接指定新的欄位名稱
df.columns = ['A', 'B', 'C']

使用函數轉換

# 全部轉大寫
df_renamed = df.rename(columns=str.upper)

# 全部轉小寫
df_renamed = df.rename(columns=str.lower)

# 自訂函數
df_renamed = df.rename(columns=lambda x: x.replace('col', 'column'))

重新命名索引

使用 rename()

# 重新命名特定索引
df_renamed = df.rename(index={'a': 'A', 'b': 'B'})

使用函數轉換

df_renamed = df.rename(index=str.upper)

同時重新命名欄位和索引

df_renamed = df.rename(
    columns={'col1': 'A', 'col2': 'B'},
    index={'a': 'X', 'b': 'Y'}
)

設定索引/欄位的名稱

索引和欄位本身也可以有名稱:

# 設定索引名稱
df.index.name = 'row_id'

# 設定欄位名稱(整個 columns 的名稱)
df.columns.name = 'features'

print(df)
features  col1  col2  col3
row_id                    
a            1     4     7
b            2     5     8
c            3     6     9

清理欄位名稱

移除空白

# 移除欄位名稱前後的空白
df.columns = df.columns.str.strip()

替換特殊字元

# 把空格換成底線
df.columns = df.columns.str.replace(' ', '_')

# 移除特殊字元
df.columns = df.columns.str.replace('[^a-zA-Z0-9_]', '', regex=True)

統一格式

# 全部轉小寫並把空格換成底線
df.columns = df.columns.str.lower().str.replace(' ', '_')

加上前綴或後綴

# 加上前綴
df_prefixed = df.add_prefix('feature_')
print(df_prefixed.columns)
# Index(['feature_col1', 'feature_col2', 'feature_col3'], dtype='object')

# 加上後綴
df_suffixed = df.add_suffix('_value')
print(df_suffixed.columns)
# Index(['col1_value', 'col2_value', 'col3_value'], dtype='object')

根據位置重新命名

# 重新命名第一個欄位
new_columns = df.columns.tolist()
new_columns[0] = 'first_column'
df.columns = new_columns

實際應用範例

讀取資料後清理欄位名稱

df = pd.read_csv('data.csv')

# 常見的清理流程
df.columns = (df.columns
    .str.strip()               # 移除空白
    .str.lower()               # 轉小寫
    .str.replace(' ', '_')     # 空格換底線
    .str.replace('[^a-z0-9_]', '', regex=True)  # 移除特殊字元
)

批次重新命名

# 建立映射字典
rename_dict = {
    'old_name1': 'new_name1',
    'old_name2': 'new_name2',
    'old_name3': 'new_name3'
}

df = df.rename(columns=rename_dict)

根據條件重新命名

# 只重新命名以 'col' 開頭的欄位
df.columns = [f'feature_{c}' if c.startswith('col') else c for c in df.columns]