CSV và TSV
Giới thiệu
CSV và TSV là hai định dạng phổ biến dùng để lưu trữ dữ liệu trong các bảng. Cả hai đều là dạng văn bản thuần, với các giá trị trong mỗi dòng được phân tách bởi dấu phân cách. Dưới đây là sự khác biệt và cách làm việc với hai định dạng này
CSV
Dữ liệu trong tệp CSV được phân tách bởi dấu phẩy ','.
Ví dụ
id,name,age
1,John,25
2,Jane,30
3,Bob,22
- Ưu điểm: Được hỗ trợ rộng rãi trong các công cụ phân tích dữ liệu, như Excel, Python (Pandas), cơ sở dữ liệu.
- Nhược điểm: Nếu dữ liệu có dấu phẩy (,), phải dùng dấu ngoặc kép (") để bao quanh dữ liệu đó (ví dụ:
"John, Doe").
TSV
Dữ liệu trong tệp TSV được phân tách bởi dấu tab '\t'.
Ví dụ
id name age
1 John 25
2 Jane 30
3 Bob 22
- Ưu đi ểm: Không có vấn đề với dấu phẩy trong dữ liệu, vì tab (
\t) là một ký tự ít được sử dụng trong các giá trị. - Nhược điểm: Ít phổ biến hơn CSV, do đó có thể không được hỗ trợ bởi các công cụ hoặc nền tảng mà CSV hỗ trợ.
Đọc File
Chúng ta có thể đọc file csv với pandas theo lệnh sau
df = pd.read_csv(filepath, sep=',', names=NoDefault.no_default, index_col=None, usecols=None, dtype=None, skiprows=None, skipfooter=0, nrows=None)
Trong đó:
-
filepathlà đường dẫn đến file trong máy hoặc đường link URL -
sepdùng để nhận diện cách chia thành cột, nếu không truyền tham số này thìpandastự hiểu là chia theo',', ngoài ra có thể chia theo';'đối với macOS và'\t'với file có định dạng.tsv -
nameslà tên các cột của bảng. Nếu bảng đã có tên cột thì nên bỏ qua tham số này,pandassẽ lấy dòng đầu tiên của file làm tên cột. -
index_coldùng để chỉ định vị trí các cột dùng để làm index cho bảng. -
usecolsdùng để chỉ định vị trí hoặc tên các cột cần đọc. -
dtypedùng để định dạng kiểu dữ liệu của các cột. -
skiprowsđược dùng khi muốn bỏ qua một số dòng đầu của bảng. -
skipfootertương tự nhưskiprowsnhưng sẽ bỏ qua các dòng cuối cùng của bảng. -
nrowsdùng để chỉ định số lượng dòng của bạn mà bạn sẽ đọc bằngpandas
Ví dụ
Đọc file dữ liệu sale được cho tại đây. Các bạn có thể xem qua dữ liệu mẫu
,store,type,department,date,weekly_sales,is_holiday,temperature_c,fuel_price_usd_per_l,unemployment
0,1,A,1,2010-02-05,24924.5,False,5.727777777777779,0.6794508388787476,8.106
1,1,A,1,2010-03-05,21827.9,False,8.055555555555555,0.693451964252221,8.106
2,1,A,1,2010-04-02,57258.43,False,16.81666666666667,0.718284148876872,7.808
3,1,A,1,2010-05-07,17413.94,False,22.52777777777778,0.7489281213923986,7.808
4,1,A,1,2010-06-04,17558.09,False,27.049999999999997,0.7145857384008601,7.808
5,1,A,1,2010-07-02,16333.14,False,27.17222222222222,0.7050755400339724,7.787000000000001
6,1,A,1,2010-08-06,17508.41,False,30.64444444444444,0.693980308605937,7.787000000000001
7,1,A,1,2010-09-03,16241.78,False,27.338888888888885,0.6807716997630375,7.787000000000001
8,1,A,1,2010-10-01,20094.19,False,22.16111111111111,0.6876401763613453,7.837999999999999
9,1,A,1,2010-11-05,34238.88,False,14.855555555555558,0.7103589835711321,7.837999999999999
10,1,A,1,2010-12-03,22517.56,False,9.594444444444447,0.7153782549314341,7.837999999999999
11,1,A,1,2011-01-07,15984.24,False,9.038888888888891,0.7861763983293752,7.742000000000001
Giả sử ta chỉ lấy các cột date, weekly_sales và is_holiday và lấy cột date làm index và chỉ lấy 6 dòng đầu
df = pd.read_csv('https://raw.githubusercontent.com/lhduc94/kungfupandas/master/data/sales_subset.csv', index_col=['date'], usecols=['date','weekly_sales','is_holiday'], nrows=6)
df
weekly_sales is_holiday
date
2010-02-05 24924.50 False
2010-03-05 21827.90 False
2010-04-02 57258.43 False
2010-05-07 17413.94 False
2010-06-04 17558.09 False
2010-07-02 16333.14 False
Xuất file
Để lưu DataFrame dưới dạng file ta có thể dùng câu lệnh .to_csv() theo cú pháp sau
df.to_csv(filename, sep=',', columns=None, header=True, index=True)
Trong đó:
-
filenamelà địa chỉ file mà bạn muốn lưu lại -
septương tự như lúc đọc file -
columnslà tên các cột bạn muốn lưu xuống, nếu muốn lưu tất cả các cột thì bạn có thể bỏ qua tham số này. -
headermặc định làTruenếu bạn muốn lưu tên cột -
indexmặc định làTruenếu bạn muốn lưu index của bảng.
Ví dụ
df.to_csv('sales.csv', columns='weekly_sales', index=False)