Chuyển đến nội dung chính

Đổi Tên Cột Trong Pandas: Hướng Dẫn Hoàn Chỉnh Kèm Ví Dụ

Tìm hiểu cách đổi tên cột trong pandas với .rename(), df.columns và .set_axis(), cùng hàm Python cho snake_case và cách khắc phục KeyError, ValueError.
Đã cập nhật 17 thg 8, 2026  · 13 phút đọc

Khám phá với AI

ChatGPTClaudePerplexity

Bạn lấy một CSV mới từ cơ sở dữ liệu công ty, chạy df.head(), và thấy CUST_ID_NBR, txn_amt_usd_2, Unnamed: 7, hoặc một cột tên Customer Name (Full) có dấu cách ở cuối mà bạn sẽ không để ý cho đến khi một KeyError phá hỏng buổi chiều của bạn. Tên cột lộn xộn là một trong những va vấp nhỏ khi làm việc với dữ liệu thực tế, và bước pandas đổi tên cột thường là việc đầu tiên bạn làm trước khi bắt đầu phân tích thực sự.

Trong hướng dẫn cách đổi tên cột trong pandas này, bạn sẽ học:

  • đổi tên một hoặc nhiều cột với .rename()

  • thay toàn bộ tên cột cùng lúc với df.columns hoặc .set_axis()

  • áp dụng hàm để biến đổi tên hàng loạt

  • dọn sạch tên lộn xộn với bộ truy cập .str

  • đổi tên cột ngay khi nạp dữ liệu trong pd.read_csv()

  • xử lý các tác vụ tương tự trong Polars

  • tránh gặp KeyErrorValueError: Length mismatch

Hướng dẫn này giả định bạn có thể nhập pandas và tạo một DataFrame. Chúng ta sẽ dùng các tập dữ liệu thực tế xuyên suốt, như hồ sơ khách hàng, xuất bán hàng và số liệu cảm biến, để các mẫu áp dụng trực tiếp cho loại dữ liệu bạn thực sự làm việc.

Nên Chọn Phương Pháp Đổi Tên Nào Trong Pandas?

Hãy chọn phương pháp phù hợp với phạm vi tác vụ: đổi tên có chủ đích, thay toàn bộ, hoặc áp dụng một quy tắc lên tất cả tên.

Mục tiêu của bạn

Phương pháp

Khi nào phù hợp

Đổi tên một hoặc vài cột cụ thể

df.rename(columns={"old": "new"})

Giữ nguyên các cột khác; an toàn trong chuỗi phương thức

Thay mọi tên cột

df.columns = [...] hoặc df.set_axis([...], axis=1)

Nhanh hơn so với ánh xạ từng tên; dùng .set_axis() khi cần xâu chuỗi

Đổi tên theo quy tắc (chữ thường, snake_case, loại bỏ khoảng trắng)

df.rename(columns=func) hoặc df.columns.str....

Diễn đạt quy tắc một lần thay vì liệt kê mọi cột

Đổi tên khi nạp dữ liệu

pd.read_csv(..., header=0, names=[...])

Bạn kiểm soát schema và không muốn bước riêng

Bất kỳ điều nào ở trên trong Polars

df.rename({"old": "new"}), .alias() trong select

Bất biến và ưu tiên xâu chuỗi, nên không có inplace

Đổi Tên Cột Với .rename() Như Thế Nào?

Phương thức .rename() là cách linh hoạt nhất để thực hiện thao tác pandas DataFrame đổi tên cột, và cũng là cách bạn sẽ dùng thường xuyên nhất. 

Nó nhận một từ điển ánh xạ tên cũ sang tên mới, giữ nguyên các cột bạn không đề cập, và theo mặc định trả về một DataFrame mới thay vì sửa đổi bản gốc. Điều này khiến .rename() an toàn khi dùng trong chuỗi phương thức và dễ suy luận khi gỡ lỗi.

Mẫu từ điển trông như sau:

sales_data.rename(columns={"old_name": "new_name"})

Nếu bạn mới làm quen với từ điển, tôi khuyên bạn xem qua hướng dẫn về phương thức từ điển trong Python để ôn tập.

Lưu ý về tham số copy cũ

Một lưu ý nhanh trước khi vào ví dụ. Pandas 3.0 đã loại bỏ tham số copy và đặt Copy-on-Write làm hành vi mặc định. Trong thực tế, điều này có nghĩa là bạn không còn phải lo lắng liệu .rename() có đang tạo một bản sao tốn kém của dữ liệu hay không. Pandas xử lý việc đó một cách lười biếng ở tầng bên dưới. Tham số chính còn lại cần cân nhắc là inplace, chúng ta sẽ bàn trong tiểu mục thứ ba.

Đổi tên một cột

Hãy tưởng tượng bạn vừa tải hồ sơ khách hàng xuất ra từ một CRM cũ. Tên cột được viết tắt theo cách có ý nghĩa với người thiết kế cơ sở dữ liệu năm 2008, nhưng không phải với bạn. Đây là thao tác pandas đổi tên cột đơn giản nhất: một tên cũ, một tên mới, trong một từ điển:

import pandas as pd

customers = pd.DataFrame({
    "cust_id_nbr": [4521, 4522, 4523, 4524],
    "first_nm": ["Abe", "Rick", "Pat", "Kim"],
    "signup_dt": ["2008-03-12", "2008-03-15", "2008-03-18", "2008-03-21"]
})

print(customers)

Python DataFrame

Giờ hãy đổi cust_id_nbr sang tên dễ đọc hơn:

customers_renamed = customers.rename(columns={"cust_id_nbr": "customer_id"})
print(customers_renamed)

Python DataFrame

DataFrame customers gốc không thay đổi. .rename() trả về một DataFrame mới, chúng ta gán vào customers_renamed. Hai cột không đề cập (first_nm, signup_dt) giữ nguyên.

Đổi tên nhiều cột

Từ điển này mở rộng rất tự nhiên. Để xử lý tác vụ pandas đổi tên nhiều cột, chỉ cần thêm nhiều cặp khóa-giá trị vào ánh xạ:

customers_clean = customers.rename(columns={
    "cust_id_nbr": "customer_id",
    "first_nm": "first_name",
    "signup_dt": "signup_date"
})

print(customers_clean)

Python DataFrame

Cũng có một cú pháp thay thế dùng tham số mapperaxis thay vì từ khóa columns:

customers.rename(mapper={"cust_id_nbr": "customer_id"}, axis=1)

Tham số axis=1 cho pandas biết bạn đang nhắm vào cột (trái ngược axis=0 cho nhãn chỉ mục hàng). Cả hai cách cho ra kết quả như nhau. Hầu hết mã ngoài kia dùng columns={...} vì đọc dễ hiểu hơn ngay từ cái nhìn đầu tiên, nên chúng ta sẽ giữ mẫu đó cho phần còn lại của hướng dẫn.

Một chi tiết hữu ích là nếu bạn truyền một khóa không khớp cột nào hiện có, .rename() mặc định sẽ lờ đi một cách im lặng. Điều này tiện khi bạn viết hàm tái sử dụng có thể xử lý DataFrame với schema hơi khác nhau, nhưng cũng có thể che giấu lỗi gõ. Để buộc pandas ném lỗi với tên cột không tồn tại, truyền errors='raise'.

Dùng inplace so với trả về DataFrame mới

Theo mặc định, .rename() trả về một DataFrame mới và để nguyên bản gốc. Nếu bạn muốn sửa đổi trực tiếp DataFrame hiện có, truyền inplace=True:

# Trả về DataFrame mới (mặc định)
customers_v2 = customers.rename(columns={"first_nm": "first_name"})

# Sửa trực tiếp customers, trả về None
customers.rename(columns={"first_nm": "first_name"}, inplace=True)

print(customers)

Python DataFrame

Vậy nên dùng cái nào? Trong hầu hết trường hợp, mặc định trả về DataFrame mới là lựa chọn tốt hơn. Nó cũng dễ gỡ lỗi hơn, vì bạn vẫn có DataFrame gốc để kiểm tra khi có vấn đề. Và nó tránh các vấn đề aliasing gây ra SettingWithCopyWarning trong mã cũ.

Hiệu năng giờ cũng không còn là lý do để ưu tiên inplace. Với Copy-on-Write, hiện là mặc định trong pandas 3.0+, phiên bản không-inplace dùng sao chép lười biếng. Nó không thực sự nhân đôi dữ liệu cho đến khi có thay đổi. Lập luận cũ rằng inplace=True tiết kiệm bộ nhớ nay yếu hơn nhiều.

Một nơi inplace=True vẫn hợp tự nhiên là trong các script thăm dò ngắn, nơi bạn làm sạch một DataFrame theo từng bước và không quan tâm đến xâu chuỗi. Với mã sản xuất hoặc bất cứ thứ gì bạn sẽ quay lại sau này, hãy ưu tiên mặc định.

Đổi Tên Tất Cả Cột Cùng Lúc Trong Pandas Như Thế Nào?

Đôi khi bạn không muốn ánh xạ tên cũ sang tên mới. Bạn chỉ muốn thay mọi tên cột cùng lúc. Điều này xảy ra thường xuyên hơn bạn nghĩ, như các CSV không có tiêu đề nơi pandas gán 0, 1, 2 làm tên cột, tập dữ liệu có hàng tiêu đề bằng ngôn ngữ khác, hoặc các bản xuất hệ thống tạo ra tên như Field1, Field2, Field3.

Có hai cách phổ biến để làm việc này. Hoặc gán trực tiếp vào df.columns, hoặc dùng .set_axis(). Chúng cho kết quả như nhau. Sự đánh đổi là giữa ngắn gọn và khả năng xâu chuỗi.

Gán một danh sách cho df.columns

Cách trực tiếp nhất là gán một danh sách mới cho thuộc tính columns. Xét DataFrame này, được tạo từ danh sách các danh sách không có thông tin tiêu đề, giống như khi đọc một CSV không tiêu đề. Pandas quay về tên cột là số nguyên:

import pandas as pd

sensor_readings = pd.DataFrame([
    [1.2, 22.5, 1013],
    [1.5, 22.7, 1012],
    [1.3, 22.6, 1013]
])

print(sensor_readings)

Python DataFrame

Những tên cột 0, 1, và 2 vô dụng cho phân tích. Hãy thay chúng bằng cách gán một danh sách tên mới cho thuộc tính columns:

sensor_readings.columns = ["wind_speed", "temperature_c", "pressure_hpa"]
print(sensor_readings)

Python DataFrame

Hai điều cần biết về cách này. 

  1. Độ dài danh sách phải khớp chính xác. Truyền ba tên cho DataFrame bốn cột, và pandas sẽ ném ValueError: Length mismatch (chúng ta sẽ nói kỹ về lỗi này sau). 

  2. Nó sửa đổi DataFrame tại chỗ. Không có tham số inplace ở đây vì phép gán chính là sửa đổi. Nếu bạn muốn một bản sao mới, dùng .copy() trước hoặc dùng .set_axis() bên dưới.

Dùng .set_axis() để xâu chuỗi phương thức

Phương thức .set_axis() làm điều tương tự, nhưng trả về một DataFrame mới để bạn có thể xâu chuỗi với thao tác khác. Lấy một DataFrame không tiêu đề tương tự, nhưng lần này dữ liệu lộn xộn hơn như nhiều chữ số thập phân và thiếu một số đo:

raw_sensor = pd.DataFrame([
    [1.234, 22.567, 1013],
    [1.512, 22.789, 1012],
    [None,  22.601, 1013],
    [1.345, 22.612, 1013]
])

sensor_clean = (
    raw_sensor
    .set_axis(["wind_speed_mps", "temp_celsius", "pressure_hpa"], axis=1)
    .round(1)
    .dropna()
)

print(sensor_clean)

Python DataFrame

Tham số axis=1 cho pandas biết bạn đang đặt nhãn cột (dùng axis=0 để đặt chỉ mục hàng). Vì .set_axis() trả về DataFrame mới, nó phù hợp tự nhiên với kiểu pipeline biến đổi được xâu chuỗi mà bạn viết trong ETL hay mã phân tích thực tế. Đó là lý do chính để ưu tiên nó thay vì gán trực tiếp trong môi trường sản xuất.

Đổi Tên Cột Bằng Hàm Trong Pandas Như Thế Nào?

Thay vì ánh xạ từng tên cũ sang tên mới, bạn có thể truyền một hàm vào .rename(), và pandas sẽ áp dụng nó lên mọi tên cột. Đây là công cụ đúng đắn khi bạn có một quy tắc thay vì một danh sách. Ví dụ, "chuyển tất cả thành chữ thường" hoặc "thay mọi khoảng trắng bằng gạch dưới".

Dùng các hàm chuỗi dựng sẵn

Trường hợp đơn giản nhất là chuẩn hóa kiểu chữ. Truyền trực tiếp str.lower, str.upper hoặc str.title vào tham số columns:

import pandas as pd

orders = pd.DataFrame({
    "Order ID": [1001, 1002, 1003],
    "Customer Name": ["Abe", "Rick", "Pat"],
    "Total Amount": [49.99, 120.00, 75.50]
})

orders_lower = orders.rename(columns=str.lower)
print(orders_lower.columns.tolist())

Danh sách cột Python

Lưu ý chúng ta truyền chính hàm (str.lower), không gọi nó (str.lower()). Pandas áp dụng nó lên từng tên cột một. Đây là lối tắt gọn gàng để chuẩn hóa kiểu chữ, nhưng nó không xử lý khoảng trắng hay ký tự đặc biệt. Với các trường hợp đó, bạn sẽ cần lambda hoặc hàm tùy chỉnh.

Dùng lambda và hàm tùy chỉnh

Với bất cứ thứ gì vượt quá thay đổi kiểu chữ, lambda cho bạn cách nhanh để diễn đạt biến đổi ngay trong dòng. Nếu bạn chưa dùng lambda trước đây, hướng dẫn lambda cho người mới bắt đầu là điểm khởi đầu tốt.

Một mẫu thường gặp là chuyển thành chữ thường và thay khoảng trắng bằng gạch dưới trong một bước. Ta dùng ví dụ trước:

orders_snake = orders.rename(columns=lambda col: col.lower().replace(" ", "_"))
print(orders_snake.columns.tolist())

Danh sách cột Python

Khi logic phức tạp hơn, hãy tách ra thành một hàm đặt tên. Xem trợ thủ này chuyển tên cột camelCase hoặc PascalCase sang snake_case:

import re

def to_snake_case(name: str) -> str:
    """Convert camelCase or PascalCase to snake_case."""
    s1 = re.sub(r"(.)([A-Z][a-z]+)", r"\1_\2", name)
    s2 = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s1)
    return s2.lower()

api_response = pd.DataFrame({
    "userId": [1, 2, 3],
    "firstName": ["Abe", "Rick", "Pat"],
    "accountCreatedAt": ["2024-01-01", "2024-01-02", "2024-01-03"]
})

api_clean = api_response.rename(columns=to_snake_case)
print(api_clean.columns.tolist())

Danh sách cột Python

Một hàm đặt tên như thế này dễ kiểm thử, tái sử dụng giữa các notebook và ghi chú tài liệu hơn là một dòng ngắn gọn "ngầu". Dùng lambda khi logic gói gọn trong một dòng, và dùng hàm tùy chỉnh khi không thể.

Làm Thế Nào Để Dọn Sạch Hàng Loạt Tên Cột Lộn Xộn Trong Pandas?

Khi dữ liệu đến từ bảng tính, API bên thứ ba, hoặc CSV do con người chỉnh tay, tên cột thường gặp các vấn đề mà .rename() một mình không xử lý gọn ghẽ. Tôi đang nói về các vấn đề như:

  • Khoảng trắng ở cuối
  • Kiểu chữ lẫn lộn
  • Dấu ngoặc tròn
  • Dấu gạch nối
  • Ký tự đặc biệt
  • Ký tự Unicode vô hình

Với các tình huống này, cách sạch nhất là thao tác trực tiếp trên df.columns dùng bộ truy cập .str, bộ này cung cấp các phương thức chuỗi vector hóa (bao gồm regex) cho tất cả tên cột cùng lúc. Đây cũng là nền tảng của làm sạch dữ liệu trong Python vững chắc. Dọn sạch tên cột giúp mọi bước phía sau (lọc, gộp, vẽ) ít lỗi hơn.

Loại bỏ khoảng trắng và ký tự đặc biệt

Xét DataFrame này, với kiểu tên bạn nhận được từ một bản xuất Excel bị quá nhiều người chạm tay:

import pandas as pd

raw_export = pd.DataFrame({
    "  Order ID ": [1001, 1002, 1003],
    "Customer Name (Full)": ["Abe", "Rick", "Pat"],
    "Total Amount ($)": [49.99, 120.00, 75.50],
    "Order-Date": ["2024-03-12", "2024-03-15", "2024-03-18"]
})

print(raw_export.columns.tolist())

Danh sách cột Python

Khoảng trắng đầu và cuối là vấn đề phổ biến và khó chịu nhất, vì chúng vô hình. Loại bỏ chúng trong một dòng:

raw_export.columns = raw_export.columns.str.strip()
print(raw_export.columns.tolist())

Danh sách cột Python

Với ký tự đặc biệt, .str.replace() chấp nhận mẫu regex. Mẫu dưới đây giữ chữ cái, số, gạch dưới và khoảng trắng, và bỏ mọi thứ khác:

raw_export.columns = raw_export.columns.str.replace(r"[^a-zA-Z0-9_ ]", "", regex=True)
print(raw_export.columns.tolist())

Danh sách cột Python

Dấu gạch nối, ngoặc tròn và ký hiệu đô la đã biến mất. Lưu ý rằng Total Amount giờ có khoảng trắng ở cuối (từ chỗ ($) trước đây), và OrderDate mất hẳn dấu gạch nối. Đó chính là lý do ta loại bỏ khoảng trắng lần nữa ở cuối pipeline làm sạch.

Chuẩn hóa về snake_case

Thực hành tốt phổ biến là chuyển mọi tên cột về snake_case trước khi bắt đầu phân tích: toàn chữ thường, các từ cách nhau bằng gạch dưới, không ký tự đặc biệt. Xâu chuỗi các phương thức .str để đạt được điều đó trong một biểu thức:

raw_export = pd.DataFrame({
    "  Order ID ": [1001, 1002, 1003],
    "Customer Name (Full)": ["Abe", "Rick", "Pat"],
    "Total Amount ($)": [49.99, 120.00, 75.50],
    "Order-Date": ["2024-03-12", "2024-03-15", "2024-03-18"]
})

raw_export.columns = (
    raw_export.columns
    .str.strip()                                  # loại bỏ khoảng trắng đầu/cuối
    .str.lower()                                  # chuyển tất cả thành chữ thường
    .str.replace(r"[^a-z0-9]+", "_", regex=True)  # gom ký tự không chữ-số thành gạch dưới
    .str.strip("_")                               # loại bỏ gạch dưới ở đầu/cuối
)

print(raw_export.columns.tolist())

Danh sách cột Python

Bốn dòng, và tên cột của bạn đã có thể dự đoán, chữ thường và phân tách bằng gạch dưới. Mẫu này đáng để lưu thành hàm tiện ích. Khi đã có, bạn có thể áp dụng cho mọi DataFrame lộn xộn đi qua cửa. 

Bạn cũng thường muốn kết hợp đổi tên với loại bỏ cột. Với điều đó, hướng dẫn xóa cột trong pandas bao quát bước tiếp theo.

Đổi Tên Cột Khi Nạp Dữ Liệu Trong Pandas Như Thế Nào?

Nếu bạn đã biết mình muốn các tên cột khác ngay trước khi nạp tệp, bạn có thể đổi tên trực tiếp trong pd.read_csv(). Truyền một danh sách tên vào tham số names và đặt header=0 để báo pandas bỏ qua hàng tiêu đề hiện có và dùng tên của bạn thay thế:

import pandas as pd
from io import StringIO

# Mô phỏng một tệp CSV để minh họa
csv_data = """txnId,custId,amt,date
1001,C01,49.99,2024-01-15
1002,C02,125.00,2024-01-16
1003,C01,79.50,2024-01-17"""

# Đổi tên cột khi nạp, bỏ qua tiêu đề gốc
transactions = pd.read_csv(
    StringIO(csv_data),
    header=0,
    names=["transaction_id", "customer_id", "amount_usd", "transaction_date"]
)
print(transactions)

Python DataFrame

Đây là lối tắt hữu ích khi bạn kiểm soát schema và không muốn một bước .rename() riêng làm rối mã nạp dữ liệu. Nếu tệp hoàn toàn không có hàng tiêu đề, bỏ header=0 và chỉ dùng names=[...] để gán tên cột từ đầu. Để xem sâu hơn các tùy chọn nạp dữ liệu, tôi khuyên bạn xem hướng dẫn pandas read_csv().

Một lưu ý: Đây là cách "tất cả hoặc không gì cả". Tham số names thay thế mọi tên cột, nên độ dài danh sách phải khớp chính xác số cột trong tệp. Nếu bạn chỉ muốn đổi tên vài cột, hãy nạp tệp trước rồi dùng .rename() sau đó.

Để được hướng dẫn từng bước về các mẫu này cùng các tác vụ dọn dẹp phổ biến khác, tôi khuyên bạn học khóa Cleaning Data in Python.

Đổi Tên Cột Trong Polars So Với Pandas

Nếu bạn làm việc với cả pandas và Polars, hoặc kỳ vọng sẽ làm, đáng để biết mỗi thư viện xử lý đổi tên cột thế nào. API cấp cao tương tự nhau, nhưng chi tiết khác biệt theo cách dễ khiến bạn vấp trong vài lần đầu. Polars là thư viện DataFrame nhanh dựa trên Rust, ngày càng phổ biến trong các stack dữ liệu hiện đại, và thói quen cơ bắp bạn xây trong pandas không phải lúc nào cũng chuyển giao trơn tru.

Ý chính là giống nhau. Bạn ánh xạ tên cũ sang tên mới bằng từ điển. Khác biệt nằm ở chi tiết. Polars là bất biến theo thiết kế (không có inplace), xâu chuỗi phương thức là phong cách chuẩn, và đổi tên ở cấp cột trong lúc select dùng .alias() thay vì một bước rename riêng.

So sánh song song

Tác vụ

Pandas

Polars

Đổi tên các cột cụ thể

df.rename(columns={"old": "new"})

df.rename({"old": "new"})

Thay mọi tên cột

df.columns = [...] hoặc df.set_axis([...], axis=1)

df.rename(dict(zip(df.columns, [...])))

Đổi tên trong lúc select

Select trước, rồi .rename()

df.select(pl.col("old").alias("new"))

Sửa đổi tại chỗ

inplace=True được hỗ trợ

Không hỗ trợ. Luôn trả về DataFrame mới

Phong cách chuẩn

inplace hoặc xâu chuỗi

Luôn xâu chuỗi

Cùng một thao tác đổi tên trong cả hai thư viện

Để so sánh, đây là một thao tác đổi tên đơn giản trong mỗi thư viện.

Pandas:

# Pandas
import pandas as pd

orders_pd = pd.DataFrame({
    "ord_id": [1001, 1002, 1003],
    "cust_nm": ["Abe", "Rick", "Pat"]
})

orders_pd = orders_pd.rename(columns={"ord_id": "order_id", "cust_nm": "customer_name"})
print(orders_pd)

Python DataFrame

Polars:

# Polars
import polars as pl

orders_pl = pl.DataFrame({
    "ord_id": [1001, 1002, 1003],
    "cust_nm": ["Abe", "Rick", "Pat"]
})

orders_pl = orders_pl.rename({"ord_id": "order_id", "cust_nm": "customer_name"})
print(orders_pl)

Python DataFrame

Có hai khác biệt nhỏ cần chú ý. .rename() của Polars nhận từ điển trực tiếp. Không có từ khóa columns= vì Polars chỉ hỗ trợ đổi tên cột (không có chỉ mục hàng). Và bạn phải gán lại kết quả. Polars không có inplace=True. Mọi thao tác đều trả về DataFrame mới.

Kết quả Polars cũng hiển thị kiểu dữ liệu ngay trong bảng (i64, str) và kích thước ở đầu, là một trong những tiện ích nhỏ mà nhiều người thích khi chuyển sang dùng. 

Đổi tên cột trong lúc select

Khi đổi tên trong quá trình biến đổi, Polars dùng .alias() bên trong .select() hoặc .with_columns():

# Polars
import polars as pl

orders_pl = pl.DataFrame({
    "ord_id": [1001, 1002, 1003],
    "cust_nm": ["Abe", "Rick", "Pat"]
})

# Select và đổi tên trong một biểu thức
renamed = orders_pl.select(
    pl.col("ord_id").alias("order_id"),
    pl.col("cust_nm").alias("customer_name")
)

print(renamed)

Python DataFrame

Trong pandas, tương đương sẽ là một .rename() sau khi chọn cột. Không cách nào tốt hơn. Chúng phản ánh triết lý thiết kế của mỗi thư viện. 

Nếu bạn muốn so sánh sâu hơn giữa hai thư viện, tôi khuyên xem hướng dẫn hiệu năng pandas và polars. Và nếu bạn muốn bổ sung polars vào bộ công cụ của mình, tôi khuyên học khóa Introduction to Polars course. 

Lỗi Thường Gặp Và Cách Khắc Phục

Hai lỗi lặp đi lặp lại khi đổi tên cột trong pandas. Đây là cách chúng trông như thế nào, vì sao xảy ra, và cách sửa.

KeyError: không tìm thấy tên cột

Theo mặc định, .rename() lờ đi các khóa không khớp cột hiện có. Nhưng nếu bạn truyền errors='raise' để bắt lỗi gõ, bạn sẽ gặp KeyError khi một khóa không tồn tại:

import pandas as pd

orders = pd.DataFrame({
    "order_id": [1001, 1002, 1003],
    "customer_name": ["Abe", "Rick", "Pat"]
})

# Dòng này sẽ ném lỗi
orders.rename(columns={"Order_ID": "order_id"}, errors="raise")

KeyError

Nguyên nhân phổ biến nhất là nhầm lẫn phân biệt hoa thường (Order_ID so với order_id) hoặc khoảng trắng vô hình ở cuối ("order_id " so với "order_id"). Khi gặp KeyError, hãy kiểm tra ba điều theo thứ tự:

  1. Chính tả và kiểu chữ chính xác
  2. Khoảng trắng ẩn
  3. Cột đó có đã được đổi tên trước đó không

Để xác minh các tên cột thực tế:

print(orders.columns.tolist())

# Dùng repr() như một cách thay thế
print([repr(c) for c in orders.columns])

Danh sách cột Python

Khi thấy chính xác chuỗi pandas đang giữ, lỗi gõ thường sẽ lộ ra. Sau đó sửa chính tả và chạy lại:

orders = orders.rename(columns={"order_id": "Order_ID"}, errors="raise")
print(orders.columns.tolist())

Danh sách cột Python

Câu hỏi là, khi nào dùng errors='raise' so với mặc định errors='ignore'

  • Mặc định thì dễ chịu. Hữu ích trong các script xử lý DataFrame với schema thay đổi, nơi thiếu một cột không nên làm mọi thứ sập. 

  • Chuyển sang errors='raise' khi bạn muốn lỗi gõ lộ ra rõ ràng trong quá trình phát triển, đặc biệt trong notebook nơi thất bại im lặng có thể gây hàng giờ gỡ lỗi bối rối về sau.

ValueError: length mismatch với df.columns

Khi bạn gán một danh sách cho df.columns hoặc dùng .set_axis(), độ dài danh sách phải khớp chính xác số cột. Nếu không, pandas sẽ ném ValueError:

import pandas as pd

products = pd.DataFrame({
    "sku": ["A100", "A101", "A102"],
    "name": ["Widget", "Gadget", "Gizmo"],
    "price": [9.99, 14.99, 19.99]
})

# Dòng này sẽ ném lỗi
products.columns = ["product_sku", "product_name"]

ValueError

DataFrame có ba cột, nhưng chỉ cung cấp hai tên mới. Cách sửa là kiểm tra số lượng cột trước khi gán:

print(len(products.columns))
products.columns = ["product_sku", "product_name", "product_price"]
print(products.columns.tolist())

Danh sách cột Python

Nếu bạn làm việc với DataFrame có thể thay đổi số cột, dùng .rename() với từ điển sẽ an toàn hơn. Nó chỉ chạm vào các cột bạn nêu tên, nên thiếu hoặc thừa cột sẽ không làm mã sập.

Lời Kết

Đổi tên cột trong pandas chủ yếu là chọn phương pháp phù hợp với phạm vi tác vụ. Dù dùng cách nào, lợi ích thực tế lớn nhất là thống nhất một quy ước đặt tên và áp dụng nó như bước đầu tiên trong mọi phân tích. snake_case là cách hầu hết mã Python dùng. Tên cột sạch tốn vài giây lúc đầu và cứu bạn khỏi các bất ngờ KeyError trong phần còn lại của dự án.

Dùng .rename() với từ điển cho các đổi tên có mục tiêu. Khi mọi cột cần tên mới, gán vào df.columns hoặc dùng .set_axis() nhanh hơn là dựng một từ điển ánh xạ đầy đủ cũ-sang-mới. Và nếu đổi tên theo quy tắc như loại bỏ khoảng trắng, chuyển tất cả thành chữ thường, chuyển camelCase, thì truyền một hàm, hoặc dùng bộ truy cập .str cho phép bạn diễn đạt quy tắc một lần thay vì liệt kê từng trường hợp. Polars xử lý cùng công việc với API tương tự, nhưng phong cách bất biến, ưu tiên xâu chuỗi sẽ hướng bạn đến thói quen khác. 

Để tiếp tục xây dựng kỹ năng với DataFrame, tôi khuyên học khóa Data Manipulation with pandas như bước kế tiếp. Nếu bạn muốn lộ trình học có cấu trúc, lộ trình nghề Data Analyst in Python bao quát thao tác với DataFrame cùng những công cụ còn lại của nhà phân tích.

Câu hỏi thường gặp về đổi tên cột trong Pandas

Làm thế nào để đổi tên một cột trong pandas?

Có nhiều phương pháp, nhưng cách đơn giản nhất là dùng df = df.rename(columns={"old_name": "new_name"}). Bạn cũng có thể truyền tham số inplace=True để sửa trực tiếp DataFrame.

Làm thế nào để đổi tên nhiều cột trong pandas?

Để đổi tên nhiều cột trong pandas, hãy truyền tất cả các đổi tên trong một từ điển: df.rename(columns={"old1": "new1", "old2": "new2"})

Làm thế nào để đổi tên tất cả các cột trong một DataFrame pandas?

Gán một danh sách tên mới cho df.columns. Lưu ý: Hãy đảm bảo độ dài danh sách khớp với số cột, nếu không bạn sẽ gặp ValueError.

Tại sao df.rename() không thay đổi DataFrame của tôi?

Theo mặc định, .rename() trả về một DataFrame mới. Hãy gán kết quả lại bằng df = df.rename(...) hoặc dùng inplace=True.

Làm thế nào để đổi tên cột thành chữ thường trong pandas?

Dùng df.columns = df.columns.str.lower() để chuyển mọi tên cột thành chữ thường trong một bước.


Author
Rajesh Kumar
LinkedIn

Tôi là một biên tập viên nội dung về khoa học dữ liệu. Tôi yêu thích sáng tạo nội dung xoay quanh các chủ đề AI/ML/DS. Tôi cũng khám phá các công cụ AI mới và viết về chúng.

Chủ đề

Học Python Cùng DataCamp!

Courses

Xử lý dữ liệu với pandas

4 giờ
559.2K
Tìm hiểu cách nhập và làm sạch dữ liệu, tính toán thống kê và tạo trực quan hóa với pandas.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow