Để thiết lập giá trị mới cho một cấp độ đơn lẻ trong MultiIndex bằng chỉ số cấp độ (0-based), chúng ta dùng phương thức MultiIndex.set_levels() với tham số level là số nguyên.
Các bước thực hiện
1. Import thư viện
import pandas as pd
2. Tạo MultiIndex
arrays = [[1, 2, 3, 4], ['John', 'Tim', 'Jacob', 'Chris']]
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('ranks', 'student'))
3. Đặt cấp độ mới cho cấp độ 0
print("\nĐặt cấp độ mới cho cấp độ 0:\n", multiIndex.set_levels(['p', 'q', 'r', 's'], level=0))
Ví dụ hoàn chỉnh
import pandas as pd
arrays = [[1, 2, 3, 4], ['John', 'Tim', 'Jacob', 'Chris']]
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('ranks', 'student'))
print("MultiIndex gốc:\n", multiIndex)
print("\nCác cấp độ gốc:\n", multiIndex.levels)
# Đặt cấp độ mới cho cấp độ 0 (ranks)
print("\nMultiIndex sau set_levels level=0:\n", multiIndex.set_levels(['p', 'q', 'r', 's'], level=0))
Kết quả đầu ra
MultiIndex gốc:
MultiIndex([(1, 'John'), (2, 'Tim'), (3, 'Jacob'), (4, 'Chris')], names=['ranks', 'student'])
Các cấp độ gốc:
[[1, 2, 3, 4], ['Chris', 'Jacob', 'John', 'Tim']]
MultiIndex sau set_levels level=0:
MultiIndex([('p', 'John'), ('q', 'Tim'), ('r', 'Jacob'), ('s', 'Chris')], names=['ranks', 'student'])
Giải thích cơ chế levels vs codes
Khác với ví dụ trước, ở đây kết quả "đúng như mong đợi" vì:
- Cấp độ 0 ('ranks') có levels gốc:
[1, 2, 3, 4](đã sắp xếp). - Codes của cấp độ 0:
[0, 1, 2, 3](vì giá trị 1,2,3,4 đã theo thứ tự). - Levels mới:
['p', 'q', 'r', 's']. - Code 0→'p', 1→'q', 2→'r', 3→'s' → Kết quả đúng thứ tự.
Lưu ý quan trọng
set_levels() thay thế levels (giá trị duy nhất), không phải codes (vị trí). Để thay đổi giá trị thực tại từng hàng, hãy:
# Cách an toàn: tạo MultiIndex mới
new_arrays = [['p', 'q', 'r', 's'], ['John', 'Tim', 'Jacob', 'Chris']]
new_mi = pd.MultiIndex.from_arrays(new_arrays, names=('ranks', 'student'))