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]