Lập trình
xử lý dữ liệu

Học kì 1, năm học 2026–2027

Viện Trí tuệ nhân tạo, Trường ĐH Công nghệ, ĐHQGHN

Bài 4
Làm quen với pandas

Bài trước

NumPy cho ta shape, dtype, cách chọn phần tử và cách tính trên cả mảng.

Nhưng mảng chỉ biết vị trí: cột thứ 3 là giá hay vĩ độ, bạn phải tự nhớ.

pandas gắn nhãn cho từng hàng và từng cột.

Tổng quan

  1. Bảng có nhãn
  2. Đọc và hiểu dữ liệu
  3. Chọn hàng, chọn cột
  4. Tính toán và sửa bảng
  5. Kiểm tra và lưu

1.
Bảng có nhãn

Biểu diễn dữ liệu bằng DataFrame và Series.

Ví dụ về bảng

Dữ liệu giả lập; mỗi hàng là một chỗ ở, giá tính bằng USD/đêm.

chỉ mụcloạigiá
aNguyên căn100
bPhòng riêng50
cNguyên cănchưa biết

Ta cần giữ cả nhãn hàng, tên cột và kiểu dữ liệu của từng cột.

Tạo bảng với DataFrame

DataFrame là bảng hai chiều. Mỗi khoá của dict dưới đây tạo một cột.

NaN đánh dấu giá trị thiếu; chưa biết giá khác với giá bằng 0.

Nhãn và kích thước của bảng

df.index giữ nhãn hàng, df.columns giữ tên cột; cả hai là Index.

Chỉ mục không tính vào số cột: bảng có 2 cột.

Mỗi cột là một Series

Lấy cột gia: các giá trị vẫn đi cùng nhãn hàng a, b, c.

Series là dữ liệu một chiều có chỉ mục; gia là tên của Series này.

Tính toán trên Series

Nhân các giá trị với 2, như phép tính trên mảng NumPy:

Nhãn của hàng được giữ lại. Giá trị thiếu vẫn là NaN.

Mỗi cột có một dtype

Cột loại chứa chữ; cột giá chứa số thực và giá trị thiếu.

Hai dòng đầu là dtype của hai cột. Dòng cuối mô tả Series kết quả của df.dtypes.

Bài tập 1: Chọn chỗ ở

Giá giả lập (USD). Phí dọn dẹp chỉ thu một lần cho mỗi lượt ở.

Chỗ ởGiá mỗi đêmPhí dọn dẹp
a1000
b80100
c60300
  1. Tạo DataFrame và tính tổng tiền cho 2 đêm, 7 đêm bằng phép toán trên Series. Mỗi trường hợp chọn chỗ nào rẻ nhất?
  2. Từ bao nhiêu đêm thì c rẻ hơn cả a và b? Kiểm tra lại bằng code.

2.
Đọc và hiểu dữ liệu

Đọc bảng chỗ ở, kiểm tra giá rồi nhận xét mức giá.

Đọc bảng Airbnb Santiago

Tìm hiểu mức giá chỗ ở tại Santiago từ snapshot ngày 29/06/2026.

read_csv tạo DataFrame: 18.534 hàng, 19 cột.

Danh sách các cột

Một hàng là một chỗ ở; mỗi cột là một thông tin về nó.

Khoá: id, host_id. Số đo: price, minimum_nights. Nhãn phân loại: room_type, neighbourhood.

Xem trước vài dòng

Mỗi hàng là một chỗ ở; price là giá một đêm, tính bằng peso Chile (CLP).

[[...]] chọn các cột theo tên; head(3) lấy 3 hàng đầu.

Các số 0, 1, 2 bên trái là chỉ mục; id là mã chỗ ở từ file.

Đếm giá trị thiếu

Thử trên cột giá của bảng nhỏ trước:

Nhãngiagia.isna()
a100False
b50False
cNaNTrue

isna() đánh dấu ô thiếu. sum() đếm các giá trị True.

Bao nhiêu chỗ ở chưa có giá?

Trong 18.534 hàng: 846 thiếu giá, 17.688 có giá.
count() chỉ đếm giá trị không thiếu.

Giá điển hình là bao nhiêu?

Tính trên các giá được ghi nhận, đơn vị CLP/đêm.

Trung bình gấp đôi trung vị vì vài giá rất lớn kéo lên: bỏ ba giá cao nhất, trung bình còn khoảng 105.303; trung vị không đổi.

Bài tập 2: Giá có giảm không?

Giá của ba chỗ ở qua hai lần thu thập (giả lập, USD/đêm).

Chỗ ởLần 1Lần 2
a100110
b200210
c300chưa có giá
  1. Tính trung bình các giá đã biết ở mỗi lần thu thập.
  2. Tính lại hai trung bình khi chỉ xét a và b ở cả hai lần.
  3. Vì sao cách thứ nhất cho thấy giá trung bình giảm, còn cách thứ hai lại tăng?

3.
Chọn hàng, chọn cột

Chọn theo nhãn, vị trí hoặc điều kiện.

Chọn một ô

Lấy giá của chỗ ở b trong df đầu bài.

Vị trí hàngChỉ mụcloaigia
0aNguyên căn100
1bPhòng riêng50
2cNguyên cănNaN

loc dùng nhãn; iloc dùng vị trí hàng và cột (từ 0).

Chọn nhiều hàng và cột

Lấy loại và giá của hai chỗ ở b, a, theo đúng thứ tự đó.

Danh sách trước dấu phẩy chọn hàng; danh sách sau chọn cột.

Giữ kết quả dạng bảng

Tên cột "gia" → Series, shape (2,).

Danh sách ["gia"] → DataFrame, shape (2, 1).

Chọn các hàng liên tiếp

📖 Tự học

Lấy giá từ hàng a đến hết hàng b:

loc lấy cả nhãn cuối b.

iloc bỏ vị trí cuối 2, như lát cắt NumPy.

Tạo điều kiện chọn hàng

Chỉ lấy những chỗ ở nguyên căn.

Phép so sánh chạy trên từng hàng, trả về một Series bool cùng chỉ mục a, b, c.

Dùng mask để lấy hàng

loc giữ các hàng có mask bằng True: a và c.

Ngoặc vuông và .loc

Tên cột trong ngoặc cho ra cột; Series bool trong ngoặc cho ra hàng.

Cách viếtKết quả
df["gia"]Một cột, trả về Series
df[["loai", "gia"]]Nhiều cột, trả về bảng
df[mask]Các hàng có True, giữ đủ mọi cột
df.loc[mask, "gia"]Chọn hàng và cột trong một lệnh

Cần nói rõ cả hàng lẫn cột thì dùng .loc: hàng trước, cột sau.

Kết hợp nhiều điều kiện

Trong bảng Santiago, lấy nguyên căn có giá dưới 50.000 CLP/đêm. Chỉ giữ mã và giá.

&: thoả mãn cả hai; |: thoả mãn ít nhất một điều kiện.
Đặt mỗi điều kiện trong ngoặc.

Bài tập 3: Lọc theo ngân sách

Bảng lua_chon (giả lập, USD/đêm). Ngân sách: nguyên căn ≤ 100, phòng riêng ≤ 60.

Chỉ mụcloaigia
aNguyên căn90
bPhòng riêng70
cNguyên căn120
dPhòng riêng60
  1. Dự đoán các hàng được chọn.
  2. Viết mask để lấy hai cột loai, gia của các hàng đó.

4.
Tính toán và sửa bảng

Tạo bảng giá mới, sửa giá rồi tính lại các khoản tiền.

Tạo cột tính giá tiền cho ba đêm

Thêm vào df cột tiền ba đêm, tính từ giá mỗi đêm (USD).

Gán vào tên cột mới sẽ thêm cột vào bảng.

Sửa giá của một chỗ ở

Muốn thử giá mới cho b mà vẫn giữ giá trong df, tạo bản sao rồi sửa:

copy() tạo bảng riêng. Giá của b trong bang_gia là 60; trong df vẫn là 50.

Sửa Series lấy ra từ bảng

pandas 3 dùng Copy-on-Write: Series chỉ tách khỏi bảng khi bị ghi, nên sửa nó không đổi bảng.


cot_gia = bang_gia["gia"]
cot_gia.loc["a"] = 80
Chỉ mụccot_giabang_gia["gia"]
a80100
b6060
cNaNNaN

Muốn sửa bảng, gán vào bang_gia.loc[hàng, cột]. pandas 2 hành xử khác; notebook đã ghim pandas 3.

Hai lần ngoặc thì bảng không đổi

Dạng viết hay gặp trong code cũ và code do AI sinh ra:

Ngoặc thứ nhất lấy ra một Series, ngoặc thứ hai ghi vào Series đó: bảng không đổi. Viết một lệnh: bang_gia.loc["a", "gia"] = 80.

Giảm giá cho chỗ ở nguyên căn

Giảm 10% giá nguyên căn trong bang_gia; giữ giá phòng riêng.

Tính lại tiền sau khi sửa giá

ba_dem vẫn giữ kết quả cũ. Chạy lại phép tính:

Cột lưu giá trị đã tính, không lưu công thức như ô Excel.

Bài tập 4: Báo giá ba đêm

Dùng df đầu bài. Giảm 10% giá nguyên căn, rồi tính tiền ba đêm. Giữ nguyên df.


bao_gia = df.copy()
bao_gia["ba_dem"] = bao_gia["gia"] * 3
mask = bao_gia["loai"] == "Nguyên căn"
gia_nguyen_can = bao_gia.loc[mask, "gia"]
gia_nguyen_can *= 0.9
  1. Code trên cho tiền ba đêm của a là bao nhiêu? Theo yêu cầu, phải là bao nhiêu?
  2. Sửa code và kiểm tra cả ba hàng.

5.
Kiểm tra và lưu

Kiểm tra các giá trị cần chú ý và thông tin được giữ trong file.

Xem những chỗ ở giá cao nhất

Ở mục 2, giá lớn nhất gần 97 triệu CLP/đêm. Xem các hàng có giá cao nhất:

nlargest(3, "price") lấy ba hàng có giá cao nhất. Dùng id để tra lại chỗ ở trong nguồn dữ liệu.

Tỷ lệ giá dưới 80 USD/đêm

Với Series bool, mean() là tỷ lệ giá trị True.

Chỉ mụcgiagia < 80
a100False
b50True
cNaNFalse

Trên cả bảng: 1/3. Chỉ xét hàng có giá bằng notna():

Cùng câu hỏi trên bảng Santiago

Tỷ lệ giá dưới 50.000 CLP/đêm trên toàn bảng:

Chỉ trên 17.688 hàng có giá:

Mẫu số đổi thì tỷ lệ đổi: 36,0% và 37,7% trả lời hai câu hỏi khác nhau.

Lưu bảng giá để dùng tiếp

Chỉ giữ các hàng có giá và ba cột id, room_type, price.


cot = ["id", "room_type", "price"]
co_gia = listings["price"].notna()
ket_qua = listings.loc[co_gia, cot]
ket_qua.to_csv("gia_co_thong_tin.csv", index=False)

index=False bỏ chỉ mục 0, 1, … khi ghi; mã chỗ ở vẫn nằm trong cột id.

Bảng chưa kiểm tra xong: các giá rất lớn vẫn còn. Lưu để làm tiếp.

Đọc lại file vừa lưu

Đối chiếu: 17.688 hàng, 3 cột, không thiếu giá, tổng giá không đổi.

Bài tập 5: Giữ mã chỗ ở trong file

Bảng df đầu bài dùng a, b, c làm chỉ mục. Một bạn gửi bảng giá bằng cách:


bang_gui = df[["gia"]]
bang_gui.to_csv("bang_gui.csv", index=False)
  1. Người nhận chỉ có file CSV. Họ có biết mỗi giá thuộc chỗ ở nào không?
  2. Sửa cách lưu để giữ cả mã chỗ ở và giá. Đọc lại file để kiểm tra.

Tổng kết

  1. DataFrame giữ nhãn hàng và tên cột; mỗi cột là một Series có dtype riêng.
  2. Đọc dữ liệu xong, xem ngay kích thước, tên cột và số giá trị thiếu.
  3. Dùng nhãn, vị trí hoặc điều kiện để chọn hàng và cột.
  4. Muốn sửa bảng nào, gán trực tiếp vào bảng đó.
  5. Tính lại các cột phụ thuộc sau khi sửa dữ liệu.
  6. Kiểm tra tập hàng được tính và mã được giữ trong file.

Làm việc với AI thì sao?

🤖 Làm việc với AI
AI làm tốtViết biểu thức lọc, tính cột mới và xuất file khi yêu cầu rõ.
AI hay saiNhầm nhãn với vị trí; sửa Series thay vì bảng; quên tính lại cột hoặc làm mất mã khi lưu.

Kiểm chứng thế nào?

  1. Dự đoán các hàng được chọn và tính tay vài kết quả.
  2. Sau phép gán, xem bảng cần sửa và các cột phụ thuộc.
  3. Đọc lại file: mã chỗ ở có còn đi cùng đúng giá không?

Đọc thêm

  1. McKinney, chương 5: Series, DataFrame và thao tác cơ bản
  2. pandas 3: Copy-on-Write khi sửa dữ liệu
  3. McKinney, §6.1: đọc và ghi CSV