Khám phá DataFrame trong Pandas: Thao tác dữ liệu hai chiều

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ột
  • bang_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:

  1. Nhập file và chuyển cột NgaySinh sang kiểu datetime64.
  2. Thiết lập chỉ mục là cột HoTen bằng hai cách khác nhau.
  3. Đếm số cầu thủ trên mỗi đội bóng.
  4. Liệt kê 5 cầu thủ có mức lương cao nhất.
  5. 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.
  6. Tìm cầu thủ lớn tuổi nhất của đội New Orleans Saints và 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"]]

Thẻ: Pandas dataframe python datascience iloc

Đăng vào ngày 29 tháng 5 lúc 11:04