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 7
Xử lý dữ liệu chuỗi

Tên chỗ ở, giá tiền và danh sách tiện nghi.

Bài trước

  • Đọc file và giữ đúng kiểu dữ liệu, giá trị thiếu.
  • Lấy dữ liệu qua API; truy vấn bằng SQL và DuckDB.
  • Bài này xử lý các cột còn ở dạng văn bản.

Tổng quan

  1. Chuẩn hoá và lọc chuỗi
  2. Trích xuất bằng biểu thức chính quy
  3. Tách danh sách trong một ô
  4. Làm việc với AI thì sao?

Ví dụ thật dùng bảng df: chỗ ở tại Santiago, snapshot 29/06/2026. Giá: CLP/đêm.

1.
Chuẩn hoá
và lọc chuỗi

Bỏ khoảng trắng thừa, đổi về chữ thường và lọc theo từ khoá.

Xử lý chuỗi với .str

Với một chuỗi Python, viết " Ñuñoa ".strip().lower().

Series không có strip; .str áp phương thức chuỗi cho từng giá trị, trả Series mới cùng chỉ mục; giá trị thiếu vẫn là thiếu.

strip bỏ khoảng trắng ở hai đầu; lower đổi sang chữ thường.

Chuẩn hoá tên trước khi đếm

nunoa vẫn khác ñuñoa. Sửa chính tả cần quy tắc riêng.

Lọc tên có từ khoá

Lấy những tên có nhắc đến metro.

case=False: không phân biệt hoa thường.
regex=False: tìm nguyên chuỗi đã cho.
Regex sẽ được giải thích ở mục 2.

Lọc chuỗi khi có giá trị thiếu

Tên thiếu cho <NA> với dtype="string", cho False với kiểu str mặc định.

na=False loại tên thiếu khỏi kết quả lọc, nhưng không chứng minh chỗ ở ấy không có metro.

Đổi giá dạng chuỗi thành số

Trong nguồn này, $ là ký hiệu giá bằng CLP; dấu phẩy phân cách hàng nghìn.

errors="coerce" chuyển chuỗi không hợp lệ thành NaN (giá trị thiếu), thay vì báo lỗi.
Ví dụ: "hỏi chủ" → NaN.

So sánh .str.replace với apply

18.534 giá · thời gian thay chuỗi (ms)
Lưu chuỗi.str.replace × 2Hàm + apply
PyArrow2,713,0
object13,111,1

PyArrow là thư viện Python của Apache Arrow: lưu theo cột, xử lý bằng C++. Khi đã cài PyArrow, pandas 3 dùng nó để lưu chuỗi.

apply gọi hàm Python cho từng giá trị. Với object, .str cũng xử lý từng chuỗi Python. Hãy kiểm kết quả hai cách rồi đo.

Phân biệt giá thiếu và lỗi chuyển đổi

Giữ giá gốc để phân biệt giá thiếu từ nguồn với lỗi chuyển đổi.

Với ba giá ["$45,647.00", None, "hỏi chủ"], phép kiểm này cho 1 giá thiếu từ nguồn và 1 lỗi chuyển đổi.

Bài tập 1: Giá trung vị theo loại chỗ ở

Dữ liệu giả lập, USD/đêm:

LoạiGiá
" Entire home "300
"entire HOME"thiếu
"PRIVATE ROOM"40
"Private room "60
"private room"200

Tính giá trung vị theo loại, gộp các nhãn chỉ khác hoa thường hoặc khoảng trắng.

2.
Trích xuất bằng
biểu thức chính quy

Lấy số phòng, diện tích ghi trong tên chỗ ở.

Biểu thức chính quy (regex)

Biểu thức chính quy (regular expression, gọi tắt là regex) mô tả mẫu ký tự cần tìm trong chuỗi.

Trong regex, . khớp một ký tự bất kỳ,
trừ ký tự xuống dòng theo mặc định.

contains mặc định coi mẫu là regex; đặt regex=False để tìm nguyên chuỗi.

Tìm số phòng ghi trong tên

Tên (giả lập)Phần cần lấy
Modern 1BR Oasis1
Casa 3 bedrooms3
Studio 2 br centro2
Torre 2024không có

Mẫu cần tìm: chữ số → khoảng trắng tuỳ ý → BR hoặc bedroom(s).

Các thành phần của mẫu regex

r"(\d+)\s*(?:BR|bedrooms?)"

PhầnÝ nghĩa
\d+một hoặc nhiều chữ số
\s*không có hoặc có nhiều ký tự trắng
BR|bedrooms?BR, bedroom hoặc bedrooms
(\d+)Nhóm: extract trả về các chữ số này,
3 bedrooms → "3"
(?:BR|bedrooms?)Ngoặc giới hạn phạm vi của |;
?: để extract không trả về phần này.

Tiền tố r (raw string) giữ nguyên \ trong \d, \s, \b.

Lấy số phòng bằng extract

extract lấy nhóm trong lần khớp đầu tiên.

flags=re.I: không phân biệt hoa thường, nên br trong 12bravo cũng khớp BR. Mẫu còn quá rộng.

Tránh khớp nhầm bằng ranh giới từ

\b là ranh giới từ: vị trí một bên là chữ hoặc số, bên kia không phải (hoặc đầu/cuối chuỗi). Sau BR trong bravo vẫn là chữ, nên không khớp.

Chuyển kết quả trích xuất sang số

Giá trị thiếu nghĩa là quy tắc này chưa lấy được số, không phải số phòng bằng 0.

Kiểm tra mã bằng fullmatch

Mã hợp lệ gồm chữ P và các chữ số. "P12x" và "mã P12" có được nhận là mã không?

Có đoạn khớp chưa chứng tỏ cả chuỗi đúng định dạng.

Bài tập 2: Trích diện tích

Tên (giả lập)Kết quả mong muốn (m²)
Depto 45 m245
Studio 30m²30
80 M2 luxury80
Torre 2024thiếu
30m2xthiếu

Viết mẫu trích diện tích để cho đúng kết quả trong bảng.

Trích số phòng từ dữ liệu Santiago

  • flags=re.I: không phân biệt hoa thường.
  • expand=False: mẫu chỉ có một nhóm nên trả về Series.
    Mặc định expand=True: trả về DataFrame.

Mẫu chỉ khớp các cách viết BR, bedroom(s). Cần xem cả tên khớp và tên không khớp.

Có chữ metro chưa chắc là ở gần

Tên (giả lập)Có chữ metro?
Apartment near metroTrue
No metro nearbyTrue

Nên đặt tên cột nhac_metro. Muốn kết luận gần metro, cần dữ liệu khác, như khoảng cách đến ga.

3.
Tách danh sách
trong một ô

Tách danh sách tiện nghi để đếm và tính tỷ lệ.

Tách chuỗi bằng dấu phân cách

Kết quả là một danh sách trong mỗi ô. Dấu ; là quy ước của ví dụ này.

Đọc danh sách bằng json.loads

P2 có hai tiện nghi; Stove, gas là một giá trị. Cắt chuỗi JSON theo dấu phẩy sẽ tách nó làm đôi.

Tách tiện nghi thành từng hàng

explode() đưa mỗi phần tử trong danh sách thành một hàng.
P3 có danh sách rỗng thì còn trong kết quả không?

Chỉ mục vẫn là mã chỗ ở. Danh sách rỗng [] của P3 tạo một hàng NaN.

Bỏ hàng có giá trị thiếu

dropna() bỏ các hàng có giá trị thiếu trong Series.

Hàng P3: NaN bị bỏ. Dữ liệu gốc ds vẫn có đủ ba chỗ ở.

Tính tỷ lệ chỗ ở có Wifi

Ví dụ có 3 chỗ ở và 4 mục tiện nghi.

Mẫu số là 3 chỗ ở (kể cả P3 có danh sách rỗng), không phải 4 mục tiện nghi: 33,3% khác 25,0%.

Bài tập 3: Thống kê tiện nghi

Gộp nhãn chỉ khác hoa thường hoặc khoảng trắng ở hai đầu.

Chỗ ởDanh sách tiện nghi (giả lập)
P1["Wifi", " wifi ", "Kitchen"]
P2["WIFI", "Kitchen"]
P3["Kitchen", "Parking", "Parking"]
P4[]

Lập bảng cho biết mỗi tiện nghi có bao nhiêu chỗ ở liệt kê nó.

Thống kê Wifi trong dữ liệu Santiago

Tổng kết

Cần làmCách chọn
Gộp các cách viếtstrip, lower và quy tắc gộp rõ ràng
Tìm nguyên chuỗicontains(..., regex=False)
Trích / kiểm cả chuỗiextract / fullmatch
Tách nhiều giá trịsplit hoặc json.loads → explode

Giữ dữ liệu gốc, đọc cả tên khớp lẫn tên không khớp, và tính theo đúng đơn vị quan sát (chỗ ở hay mục tiện nghi).

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

🤖 Làm việc với AI
AI làm tốtĐề xuất và giải thích mẫu regex từ yêu cầu cùng ví dụ cụ thể.
AI hay saiKhớp một phần rồi coi cả chuỗi hợp lệ; khớp từ khoá rồi suy ra ý nghĩa; đếm số mục tiện nghi thay vì số chỗ ở.

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

🤖 Làm việc với AI
  1. Nêu đầu vào và kết quả mong muốn, cả trường hợp không được khớp.
  2. Chạy lại các ví dụ sau mỗi lần sửa mẫu.
  3. Đọc vài dòng khớp và vài dòng không khớp; kiểm mẫu số trước khi tính tỷ lệ.

Đọc thêm