Đọc dữ liệu vào Notebook là một trong những bước quan trọng đầu tiên bạn cần làm khi thao tác với dữ liệu. Dữ liệu có thể được nhập vào Notebook theo nhiều cách khác nhau như API Request, Download trực tiếp vào Notebook (Tensorflow Dataset), đọc từ file nội bộ, v.v... Đọc dữ liệu từ file văn bản như CSV (Comma-Separated Values) là thao tác mà Data Scientist thường xuyên thực hiện vì đây là định dạng vô cùng phổ biến. Trong bài viết này, mình sẽ hướng dẫn cho các bạn nhập dữ liệu từ file CSV vào Pandas DataFrame.

Chuẩn bị

Trước hết các bạn cài đặt pandas nếu chưa từng cài trên môi trường Python nội bộ.

!pip install pandas

Sau đó bạn khai báo thư viện này trong Notebook bằng đoạn code sau (gói thư viện os được dùng cho truy xuất file và tương tác với File System).

import pandas as pd
import os

Tiếp theo bạn kiểm tra và thiết lập một biến WORKING_DIRECTORY để lưu vị trí hiện tại của chương trình. Bước này có thể không quan trọng nhưng mình khuyên các bạn nên thiết lập đường dẫn một cách đầy đủ nếu muốn viết code theo tiêu chuẩn Production. Mặc dù Data Scientist không phải là Software Engineer nhưng chúng ta vẫn nên tuân theo những quy tắc lập trình và phát triển phần mềm để cải thiện code của mình.

WORKING_DIRECTORY = os.getcwd()
print(WORKING_DIRECTORY)

Bây giờ bạn có thể thử liệt kê các file hiện có trong thư mục đang thao tác.

os.listdir(WORKING_DIRECTORY)
['.ipynb_checkpoints',
 'Notebook.ipynb',
 'Readme.md',
 'dummy_data.csv',
 'dummy_data_pipe.csv']

Đọc File CSV căn bản

Chúng ta sẽ đọc file dummy_data.csv nên cần thiết lập một biến chứa đường dẫn đầy đủ đến file này.

DATA_FILE = f'{WORKING_DIRECTORY}/dummy_data.csv'

File này có nội dung như sau (2 dòng đầu tiên).

cust_id,name,age,address,active,job
FDFJ1245,Daniel Hickman,46,"22837 Ruiz Circle Suite 778 Dawsonview, ME 95272",False,Patent attorney

Để đọc file CSV với pandas, bạn chỉ cần sử dụng dòng code đơn giản như sau.

df = pd.read_csv(DATA_FILE)

Bây giờ hãy thử xem sơ năm dòng đầu tiên của file dữ liệu vừa đọc vào.

df.head()

csv head

Chúc mừng, bạn đã đọc dữ liệu vào Notebook thành công!

Đọc File CSV với Index

Các bạn có thể thấy DataFrame này có 6 cột bao gồm ID khách hàng, tên, tuổi, địa chỉ, trạng thái hoạt động và cuối cùng là nghề nghiệp. Phía ngoài cùng bên tay trái, bạn có thể thấy một cột không có tên bắt đầu từ 0 rồi tăng dần. Đây là cột Index của DataFrame và Index thì luôn luôn unique, tức là đảm bảo mỗi giá trị chỉ xuất hiện một lần duy nhất và được sử dụng để tham chiếu địa chỉ cho một dòng trong DataFrame.

Bạn cũng có thể xem thêm một vài thông tin khác như kiểu dữ liệu và số lượng dòng bằng cách gọi hàm info() như sau.

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   cust_id  10 non-null     object
 1   name     10 non-null     object
 2   age      10 non-null     int64 
 3   address  10 non-null     object
 4   active   10 non-null     bool  
 5   job      10 non-null     object
dtypes: bool(1), int64(1), object(4)
memory usage: 538.0+ bytes

Hiện tại bạn có thể thấy DataFrame này có 10 dòng (10 entries) và RangeIndex từ 0 đến 9. Tức là 10 dòng này sẽ được đánh địa chỉ từ 0 đến 9. Tuy nhiên trong trường hợp này, nếu bạn muốn sử dụng ID khách hàng (cust_id) làm Index (vì ID khách hàng cũng unique), bạn có thể khai báo thêm tùy chọn index_col khi đọc file.

df = pd.read_csv(DATA_FILE, index_col='cust_id')
df.head()

csv index

df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, FDFJ1245 to JGHW6291
Data columns (total 5 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   name     10 non-null     object
 1   age      10 non-null     int64 
 2   address  10 non-null     object
 3   active   10 non-null     bool  
 4   job      10 non-null     object
dtypes: bool(1), int64(1), object(3)
memory usage: 410.0+ bytes

Bây giờ bạn có thể thấy cột cust_id đã được sử dụng làm Index. Chúng ta vẫn có 10 dòng (10 entries) nhưng Index giờ đã trở thành ‘FDFJ1245 to JGHW6291’. Thủ thuật này giúp bạn truy vấn dữ liệu trong bảng dựa vào ID khách hàng nhanh hơn. Ví dụ khi bạn cần tìm khách hàng có ID JGHW6291 thì việc truy xuất trực tiếp sẽ nhanh hơn rất nhiều so với khi bạn tìm dòng dựa vào giá trị. Bạn cũng có thể thấy độ lớn DataFrame đã giảm từ 538.0 bytes xuống còn 410.0 bytes sau khi Index, điều này có nghĩa là Index hiện quả sẽ không những giúp truy cập dữ liệu nhanh hơn mà còn giúp tối ưu hóa bộ nhớ. Hãy thử tưởng tượng việc bạn tối ưu dữ liệu trong bộ nhớ từ 538 GB xuống 410 GB và truy cập dữ liệu cực nhanh trong vòng chưa đầy 1 giây so với vài chục giây trước khi Index. Trong một bài viết khác mình sẽ nói kỹ hơn về việc Index.

Đọc File CSV với tên cột tùy chọn

Vừa rồi các bạn đã đọc dữ liệu từ file CSV vào Pandas Data Frame thành công. Tuy nhiên nếu để ý các bạn có thể thấy Pandas đã sử dụng tên cột trong file CSV làm tên cột của Data Frame. Trong trường hợp bạn muốn sử dụng tên gọi khác cho các cột mà không muốn thay đổi file dữ liệu gốc thì có thể làm theo cách sau.

df = pd.read_csv(DATA_FILE, index_col='CustomerID',
                 names=['CustomerID', 'Name', 'Age', 'Address', 'Active', 'JobTitle'],
                 skiprows=1)

Trong đoạn code này, chúng ta dùng biến số đầu vào names để đặt lại tên cho tất cả các cột trong Data Frame thông qua một list các tên cột. Lưu ý là số lượng phần tử trong list này phải đúng bằng số lượng cột trong file. Thông số skiprows=1 nghĩa là chúng ta sẽ bỏ qua 1 dòng đầu tiên chứa tên cột trong file dữ liệu và dùng tên cột khai báo ở biến số names. Và đây là kết quả.

df.head()

read csv custom col names

df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, FDFJ1245 to JGHW6291
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 
 0   Name      10 non-null     object
 1   Age       10 non-null     int64 
 2   Address   10 non-null     object
 3   Active    10 non-null     bool  
 4   JobTitle  10 non-null     object
dtypes: bool(1), int64(1), object(3)
memory usage: 410.0+ bytes

 

Hi vọng rằng sau bài hướng dẫn này, bạn đã có thể biết được những thao tác cơ bản khi nhập dữ liệu từ file CSV vào Pandas Data Frame. Các bạn cũng có thể tải notebook chứa code đầy đủ của bài này tại đây:

https://github.com/chauvinhloi/datasciencevn/blob/main/read_csv/Notebook.ipynb

 

Các thủ thuật đọc dữ liệu CSV vào Pandas Data Frame https://datasciencevn.com/images/contents/Python/read_csv/stone-wang-0wk7m5SVPsM-unsplash.jpg#joomlaImage://local-images/contents/Python/read_csv/stone-wang-0wk7m5SVPsM-unsplash.jpg?width=1920&height=1280 Châu Vĩnh Lợi

Những Chủ Đề Nổi Bật

Tin Tức Liên Quan