Khóa học
Sau khi biến đổi và lọc một tập dữ liệu lớn, bạn có thể thu được đúng DataFrame mình cần. Tuy nhiên, DataFrame này vẫn giữ chỉ mục gốc, có thể không tuần tự. Trong những trường hợp như vậy, bạn cần đặt lại chỉ mục của DataFrame.
Trong hướng dẫn này, chúng ta sẽ thảo luận về phương thức reset_index() của pandas, được dùng để đặt lại chỉ mục của DataFrame. Chúng ta sẽ khám phá các tùy chọn khác nhau có sẵn với phương thức này. Ngoài ra, chúng ta sẽ đề cập cách đặt lại chỉ mục cho DataFrame đơn cấp và đa cấp.
Để thực hành đặt lại chỉ mục DataFrame, chúng ta sẽ dùng bộ dữ liệu hàng không. Chúng ta sẽ sử dụng Datalab của Datacamp, một môi trường tương tác được thiết kế riêng cho phân tích dữ liệu bằng Python, giúp bạn dễ dàng theo dõi hướng dẫn này.
reset_index là gì?
Phương thức reset_index trong Pandas đặt lại chỉ mục của DataFrame về mặc định. Sau các thao tác như lọc, nối hay gộp, chỉ mục có thể không còn tuần tự. Phương thức này giúp thiết lập lại một chỉ mục sạch, tuần tự. Nếu DataFrame có MultiIndex, nó có thể loại bỏ một hoặc nhiều cấp.
Cú pháp cơ bản:
df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill="")
Tham số:
- level: Trong DataFrame nhiều cấp, nhận tên cấp hoặc vị trí của chỉ mục hàng cần loại bỏ khỏi chỉ mục. Mặc định, loại bỏ tất cả các cấp.
- drop: Cờ Boolean. True – Chỉ mục hàng hiện tại không được thêm làm cột mới trong DataFrame. False (mặc định) – Chỉ mục hàng hiện tại được thêm làm cột mới trong DataFrame.
- inplace: Xác định trả về một DataFrame mới hay cập nhật DataFrame hiện có. Là cờ Boolean, mặc định là False.
- col_level: Nếu cột có nhiều cấp, xác định cấp nào sẽ chèn nhãn vào. Mặc định chèn vào cấp đầu tiên.
- col_fill: Nếu cột có nhiều cấp, xác định cách đặt tên cho các cấp còn lại. Nếu None, tên chỉ mục được lặp lại.
Giá trị trả về:
DataFrame với chỉ mục mới hoặc None nếu inplace=True.
Cách sử dụng reset_index
Nếu bạn đọc tệp CSV bằng phương thức read_csv() của pandas mà không chỉ định chỉ mục, DataFrame kết quả sẽ có chỉ mục mặc định dạng số nguyên, bắt đầu từ 0 và tăng 1 cho mỗi hàng tiếp theo.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv").head()
df

Trong một số trường hợp, bạn có thể muốn nhãn hàng mô tả hơn. Để làm được điều này, bạn có thể đặt một trong các cột của DataFrame làm chỉ mục (nhãn hàng). Khi sử dụng phương thức read_csv() để tải dữ liệu từ tệp CSV, hãy chỉ định cột mong muốn cho chỉ mục bằng tham số index_col.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv", index_col="Operating Airline IATA Code").head()
df

Ngoài ra, bạn có thể dùng phương thức set_index() để đặt bất kỳ cột nào của DataFrame làm chỉ mục:
import pandas as pd
df = pd.read_csv("airlines_dataset.csv").head()
df.set_index("Operating Airline IATA Code", inplace=True)
df
Lưu ý rằng đoạn mã sẽ thay đổi DataFrame gốc.

Nếu bạn cần khôi phục chỉ mục số mặc định thì sao? Đây là lúc phương thức Pandas reset_index() phát huy tác dụng.
df.reset_index()

Ví dụ cho thấy sau khi đặt cột 'Operating Airline IATA Code' làm chỉ mục, reset_index được dùng để đưa DataFrame về chỉ mục số nguyên mặc định.
Ứng dụng thực tế của reset_index
Phương thức reset_index() trong Pandas là công cụ mạnh để sắp xếp lại chỉ mục DataFrame khi làm việc với dữ liệu đã lọc, DataFrame được nối, hoặc chỉ mục nhiều cấp.
Tìm hiểu thêm về tái cấu trúc DataFrame từ dạng rộng sang dạng dài, cách stack và unstack hàng và cột, cũng như cách xử lý DataFrame đa chỉ mục trong khóa học trực tuyến của chúng tôi.
Đặt lại sau khi lọc
Khi bạn lọc một DataFrame, chỉ mục gốc được giữ nguyên. Sử dụng reset_index, bạn có thể đánh lại chỉ mục cho DataFrame đã lọc.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv")
Hãy lọc dữ liệu để chỉ chọn các hàng có "landing count" lớn hơn 1000. Sau khi lọc, chỉ mục có thể không tuần tự. Khi đó, bạn có thể dùng phương thức reset_index để đặt lại chỉ mục cho DataFrame đã lọc.
filtered_df = df[df["Landing Count"] > 1000].head()
filtered_df

Hình trên cho thấy DataFrame đã được lọc theo điều kiện áp dụng, nhưng chỉ mục chưa tuần tự. Giờ hãy dùng reset_index để đánh lại chỉ mục cho DataFrame đã lọc và đảm bảo chỉ mục tuần tự. Cách thực hiện như sau:
filtered_df_reset = filtered_df.reset_index()
filtered_df_reset

Hành vi mặc định của phương thức này là thay chỉ mục hiện có của DataFrame bằng chỉ mục dạng số nguyên mặc định và chuyển chỉ mục cũ thành một cột mới với cùng tên (hoặc "index" nếu không có tên).
Vì vậy, hãy dùng tham số drop=True để đảm bảo chỉ mục cũ không được thêm làm cột mới.
filtered_df_reset = filtered_df.reset_index(drop=True)
filtered_df_reset

Tuyệt vời! Chỉ mục giờ đã được đặt lại về chỉ mục số nguyên mặc định (0, 1, 2, …), gọn gàng và tuần tự.
Nối hoặc gộp
Khi kết hợp các DataFrame, DataFrame kết quả có thể chứa chỉ mục trùng lặp hoặc không tuần tự. Đặt lại chỉ mục sẽ tạo một chỉ mục gọn gàng, tuần tự.
Giả sử bạn có hai DataFrame và muốn nối chúng. Tôi đã tạo hai DataFrame từ bộ dữ liệu hàng không để minh họa.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv")
split_index = int(df.shape[0] / 2)
df1 = df[:split_index].head()
df2 = df[split_index:].head()
Đây là df1:

Đây là df2:

Hãy nối hai DataFrame df1 và df2.
df_concat = pd.concat([df1, df2])

Dữ liệu cho thấy các chỉ mục không tuần tự. Chúng ta cần đặt lại chỉ mục của DataFrame sau khi nối để nó tuần tự.
Hãy đặt lại chỉ mục của DataFrame bằng phương thức reset_index() trong pandas.
df_concat.reset_index()

Đây là kết quả sau khi đặt lại chỉ mục của DataFrame. Phương thức reset_index chuyển chỉ mục cũ thành một cột mới. Để loại bỏ cột thừa này, bạn cần dùng tham số drop=True.
df_concat.reset_index(drop=True)

Xử lý chỉ mục nhiều cấp
Với DataFrame có chỉ mục phân cấp (nhiều cấp), reset_index có thể được dùng để đơn giản hóa DataFrame bằng cách chuyển chỉ mục nhiều cấp về thành các cột.
Hãy xem ví dụ về một DataFrame có chỉ mục nhiều cấp.
import pandas as pd
df = pd.read_csv(
"airlines_dataset.csv", index_col=["Aircraft Model", "Operating Airline IATA Code"]
).head()

Nếu bạn kiểm tra chỉ mục của nó, bạn sẽ thấy đây không phải chỉ mục DataFrame thông thường mà là một đối tượng MultiIndex

Giờ, hãy sử dụng phương thức reset_index() của pandas, phương thức sẽ loại bỏ tất cả các cấp của MultiIndex:
df.reset_index()

Bạn có thể thấy cả hai cấp của MultiIndex đã được chuyển thành các cột thông thường của DataFrame, đồng thời chỉ mục được đặt lại về dạng số nguyên mặc định.
Bạn cũng có thể dùng tham số level để loại bỏ các cấp được chọn khỏi chỉ mục DataFrame. Nó sẽ chuyển các cấp đã chọn thành các cột thông thường trừ khi bạn chọn loại bỏ hoàn toàn thông tin này khỏi DataFrame bằng tham số drop. Hãy xem thử:
df.reset_index(level=["Aircraft Model"])

Hình trên cho thấy "Aircraft Model" giờ là một cột thông thường trong DataFrame. Chỉ còn "Operating Airline IATA Code" làm chỉ mục.
Giờ, nếu bạn không muốn chỉ mục được nêu trong danh sách trở thành cột thông thường, bạn có thể kết hợp các tham số drop và level để loại bỏ nó khỏi DataFrame.
df.reset_index(level=["Aircraft Model"], drop=True)

Chỉ mục 'Aircraft Model' đã bị loại khỏi chỉ mục và DataFrame. Chỉ mục còn lại, 'Operating Airline IATA Code', được giữ làm chỉ mục hiện tại của DataFrame.
Sử dụng nâng cao và Mẹo
Giữ lại chỉ mục
Giả sử bạn gộp hai DataFrame; DataFrame sau khi gộp sẽ không còn chỉ mục tuần tự, như hình dưới đây.

Hãy đặt lại chỉ mục của DataFrame bằng phương thức reset_index() của pandas.
df.reset_index()

Tham số drop quyết định giữ lại chỉ mục cũ dưới dạng cột trong DataFrame sau khi đặt lại chỉ mục hay loại bỏ hoàn toàn. Mặc định (drop=False), chỉ mục cũ được giữ lại, như minh họa trong tất cả ví dụ trước. Ngoài ra, đặt drop=True sẽ loại bỏ chỉ mục cũ khỏi DataFrame sau khi đặt lại.
df.reset_index(drop=True)

Thao tác tại chỗ (inplace)
Chỉnh sửa DataFrame ngay tại chỗ bằng tham số inplace để tránh tạo DataFrame mới.
Giả sử bạn có DataFrame dưới đây:

Đặt tham số inplace thành True đảm bảo các thay đổi được áp dụng trực tiếp lên DataFrame gốc, tránh tạo một DataFrame riêng.
df_concat.reset_index(drop=True, inplace=True)
df_concat

Xử lý trùng lặp
Quản lý chỉ mục trùng lặp bằng cách đặt lại và đánh chỉ mục phù hợp.
Giả sử bạn có dữ liệu với chỉ mục trùng lặp.

Dùng reset_index() với drop=True và inplace=True đảm bảo DataFrame kết quả có chỉ mục liên tục, bắt đầu từ 0 và tăng tuần tự.
df.reset_index(drop=True, inplace=True)

Các lỗi thường gặp và cách khắc phục với Pandas reset_index
- Không đặt lại được chỉ mục: Đảm bảo bạn không dùng tham số
inplace=Falsenếu bạn mong muốn DataFrame gốc được chỉnh sửa. Nếuinplaceđặt làFalse, một DataFrame mới được trả về và DataFrame gốc không thay đổi. - Mất dữ liệu: Hãy cẩn trọng với tham số
dropđể tránh vô tình làm mất dữ liệu. Loại chỉ mục sẽ xóa vĩnh viễn các giá trị chỉ mục hiện tại.
Ví dụ thực hành reset_index
Hãy áp dụng những gì chúng ta đã học về đặt lại chỉ mục DataFrame và xem việc đặt lại chỉ mục hữu ích thế nào khi loại bỏ giá trị khuyết.
Bộ dữ liệu hàng không không có giá trị khuyết, vì vậy chúng ta sẽ dùng bộ dữ liệu Phim và Chương trình TV trên Netflix. Bộ dữ liệu này có giá trị khuyết, rất phù hợp để minh họa reset_index().
import pandas as pd
df = pd.read_csv("netflix_shows.csv")
df.head()

Bạn có thể thấy có các giá trị khuyết trong DataFrame. Hãy loại các hàng chứa giá trị khuyết bằng phương thức dropna().
df.dropna(inplace=True)
df.head()

Các hàng chứa giá trị NaN đã được loại khỏi DataFrame. Tuy nhiên, chỉ mục không còn liên tục (0, 1, 2, 4). Hãy đặt lại:
df.reset_index()

Giờ đây, chỉ mục đã liên tục; tuy nhiên, vì chúng ta không truyền rõ ràng tham số drop, chỉ mục cũ đã được chuyển thành một cột với tên mặc định index. Hãy loại bỏ hoàn toàn chỉ mục cũ khỏi DataFrame:
df.reset_index(drop=True)

Chúng ta đã loại bỏ hoàn toàn chỉ mục cũ không còn ý nghĩa, và chỉ mục hiện tại giờ liên tục. Bước cuối cùng là lưu các thay đổi này vào DataFrame gốc bằng tham số inplace:
df.reset_index(drop=True, inplace=True)
Kết luận
Bạn đã học cách hàm reset_index trong Pandas quản lý hiệu quả chỉ mục của DataFrame. Dù là xử lý dữ liệu đã lọc, DataFrame được nối hay chỉ mục nhiều cấp phức tạp, reset_index đều đảm bảo DataFrame gọn gàng và có tổ chức. Các tham số của nó giúp xử lý đa dạng kịch bản chỉ mục trong các tác vụ thao tác dữ liệu.
Tiếp tục học cách dùng các hàm tương tự reset_index với lộ trình nghề nghiệp Data Analyst với Python của DataCamp. Bạn cũng có thể đọc Hướng dẫn Python List Index() nếu bạn đang làm việc với list và muốn tìm hiểu về hàm index() áp dụng cho list.
