DataFrame là cấu trúc dữ liệu cốt lõi của thư viện Pandas, biểu diễn bảng dữ liệu hai chiều với các trục hàng (index) và cột (columns). Khác với Series — chỉ chứa một chuỗi giá trị — DataFrame hỗ trợ nhiều cột đồng thời, mỗi cột có thể mang kiểu dữ liệu riêng.
Tạo DataFrame từ cấu trúc Python
Sử dụng từ điển để khởi tạo một bảng thông tin thành phố:
import pandas as pd
import numpy as np
thong_tin_thanh_pho = {
"TenThanhPho": ["Tokyo", "Seoul", "Jakarta", "Manila"],
"QuocGia": ["Nhật Bản", "Hàn Quốc", "Indonesia", "Philippines"],
"DanSo": [37400000, 25600000, 34500000, 13400000]
}
bang_du_lieu = pd.DataFrame(thong_tin_thanh_pho)
bang_du_lieu
Thuộc tính chung và riêng giữa Series và DataFrame
Series có thuộc tính dtype, trong khi DataFrame sử dụng dtypes để trả về một chuỗi kiểu dữ liệu theo từng cột:
pd.Series([10, 20, 30]).dtype
bang_du_lieu.dtypes
Các thuộc tính cơ bản khác:
bang_du_lieu.columns: danh sách tên cộtbang_du_lieu.shape: tuple (số hàng, số cột)bang_du_lieu.size: tổng số phần tử (kể cả giá trị NaN)bang_du_lieu.count().sum(): tổng số giá trị không bị thiếu trên toàn bộ bảng
Phương thức chung cho cả hai cấu trúc
Một số hàm thao tác dữ liệu hoạt động tương tự trên cả Series và DataFrame:
bong_ro = pd.read_csv("nba_players.csv", parse_dates=["NgaySinh"])
bong_ro.head(3)
bong_ro.tail(2)
bong_ro.sample(n=4)
bong_ro.max(numeric_only=True)
bong_ro.nlargest(n=5, columns="Luong")
bong_ro.sum(numeric_only=True)
bong_ro.std(numeric_only=True)
Sắp xếp dữ liệu
Sắp xếp theo một cột:
bong_ro.sort_values("HoTen", ascending=False)
Sắp xếp theo nhiều tiêu chí:
bong_ro.sort_values(by=["DoiBong", "HoTen"], ascending=[True, False])
Sắp xếp theo chỉ mục:
bong_ro = bong_ro.sort_values(["DoiBong", "HoTen"])
bong_ro = bong_ro.sort_index() # khôi phục thứ tự gốc theo index
Sắp xếp tên cột:
bong_ro.sort_index(axis=1)
Thiết lập và thay đổi chỉ mục
Gán lại chỉ mục dựa trên một cột hiện có:
bong_ro = bong_ro.set_index("HoTen")
Để đặt lại chỉ mục số nguyên mặc định và giữ cột cũ làm dữ liệu:
bong_ro = bong_ro.reset_index().set_index("DoiBong")
Lấy dữ liệu theo cột
Có hai cách chính để chọn cột:
- Dùng toán tử chấm:
bong_ro.Luong— chỉ hoạt động với tên cột hợp lệ (không chứa khoảng trắng hoặc ký tự đặc biệt) - Dùng ngoặc vuông:
bong_ro[["Luong", "NgaySinh"]]— linh hoạt hơn, hỗ trợ tên cột có dấu cách hoặc ký tự Unicode
Lọc cột theo kiểu dữ liệu:
bong_ro.select_dtypes(include="datetime64").head()
bong_ro.select_dtypes(exclude=["number"]).columns
Lấy dữ liệu theo hàng
Dựa trên nhãn chỉ mục (loc):
bong_ro.loc["Stephen Curry"]
bong_ro.loc[["Kevin Durant", "Giannis Antetokounmpo"]]
bong_ro.sort_index().loc["Zion Williamson":"Anthony Davis"]
Dựa trên vị trí số nguyên (iloc):
bong_ro.iloc[15]
bong_ro.iloc[[5, 15, 25]]
bong_ro.iloc[100:103]
Kết hợp để lấy ô đơn lẻ:
bong_ro.at["LeBron James", "DoiBong"] # nhanh hơn loc cho giá trị đơn
bong_ro.iat[42, 2] # nhanh hơn iloc cho vị trí đơn
Đổi tên cột và chỉ mục
Đổi tên cột bằng gán trực tiếp hoặc phương thức rename:
bong_ro.columns = ["Doi", "ViTri", "NgaySinh", "Luong"]
bong_ro = bong_ro.rename(columns={"Doi": "TenDoi", "ViTri": "ChucDanh"})
Tương tự, đổi tên chỉ mục bằng rename(index={...}).
Bài tập thực hành
Với tập dữ liệu nfl_players.csv (cấu trúc tương tự NBA), hãy thực hiện:
- Nhập file và chuyển cột
NgaySinhsang kiểudatetime64. - Thiết lập chỉ mục là cột
HoTenbằng hai cách khác nhau. - Đếm số cầu thủ trên mỗi đội bóng.
- Liệt kê 5 cầu thủ có mức lương cao nhất.
- Sắp xếp tăng dần theo tên đội, sau đó giảm dần theo lương trong cùng một lần gọi.
- Tìm cầu thủ lớn tuổi nhất của đội
New Orleans Saintsvà ngày sinh của người đó.
Mẫu giải:
# 1
nfl = pd.read_csv("nfl_players.csv", parse_dates=["NgaySinh"])
# 2
nfl_1 = pd.read_csv("nfl_players.csv", parse_dates=["NgaySinh"], index_col="HoTen")
nfl_2 = pd.read_csv("nfl_players.csv", parse_dates=["NgaySinh"]).set_index("HoTen")
# 3
nfl["DoiBong"].value_counts()
# 4
nfl.nlargest(5, "Luong")[["HoTen", "DoiBong", "Luong"]]
# 5
nfl.sort_values(["DoiBong", "Luong"], ascending=[True, False])
# 6
nfl[nfl["DoiBong"] == "New Orleans Saints"].sort_values("NgaySinh").iloc[0][["HoTen", "NgaySinh"]]