Khóa học
Khi bạn tạo một DataFrame hoặc chỉnh sửa một DataFrame hiện có, bạn có thể muốn xuất nó để người khác có thể làm việc với dữ liệu đó, hoặc để lưu lại cho công việc sau này của bạn. Ví dụ, bạn có thể cần nộp một kết quả dự đoán từ dự án machine learning cho giảng viên chấm điểm hoặc gửi một tập dữ liệu đã chỉnh sửa cho đồng nghiệp.
Trong Python, bạn có thể xuất một DataFrame dưới dạng tệp CSV bằng phương thức .to_csv() của Pandas.
Trong bài viết này, tôi sẽ hướng dẫn bạn qua các bước chính của quy trình và giải thích các tham số của phương thức này.
Nếu bạn muốn tìm hiểu thêm về Pandas, hãy xem khóa học về Xử lý dữ liệu với Pandas.
Tôi sẽ bắt đầu với câu trả lời nhanh cho những bạn đang vội, sau đó đi vào chi tiết.
Câu trả lời ngắn: Cách lưu Pandas DataFrame thành CSV
Để lưu một Pandas DataFrame thành CSV, hãy dùng phương thức DataFrame.to_csv():
df.to_csv('your_file_name.csv', index=False)
Hãy thay 'your_file_name.csv' bằng tên và đường dẫn mong muốn cho tệp của bạn. Tham số index=False ngăn Pandas thêm một cột chỉ mục vào CSV.
Tạo một Pandas DataFrame
Bây giờ, hãy xem câu trả lời đầy đủ hơn. Thay vì tạo DataFrame từ đầu, tôi sẽ nhập một tập dữ liệu, chỉnh sửa nó và lưu DataFrame kết quả ở định dạng CSV. Bước đầu tiên là nhập các thư viện cần thiết:
import pandas as pd
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
Sau đó, chúng ta có thể nhập một tập dữ liệu của seaborn. Tập dữ liệu được nhập đã là một Pandas DataFrame, nên chúng ta không cần chuyển đổi gì thêm.
# Chúng ta sẽ nhập tập dữ liệu 'titanic' từ seaborn
df = sns.load_dataset('titanic')
print(df.head())
survived pclass sex age sibsp parch fare embarked class
0 0 3 male 22.0 1 0 7.2500 S Third
1 1 1 female 38.0 1 0 71.2833 C First
2 1 3 female 26.0 0 0 7.9250 S Third
3 1 1 female 35.0 1 0 53.1000 S First
4 0 3 male 35.0 0 0 8.0500 S Third
who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
4 man True NaN Southampton no True
Chỉnh sửa một Pandas DataFrame
Giờ hãy xử lý một chút để thu được DataFrame mới. Vì mục đích của tôi là tìm hiểu phương thức .to_csv() của Pandas, tôi sẽ chỉ chuẩn hóa min-max trên các biến số.
scaler = MinMaxScaler()
# Chọn các cột có kiểu dữ liệu số nguyên hoặc số thực
numerical columns - df.select_dtypes(include=['float64','int64']).columns
new_df = df.copy()
# Bộ biến đổi min-max sẽ biểu diễn mọi con số trên thang 0 đến 1
new_df[numerical_columns] = scaler.fit_transform(df[numerical_columns])
print(new_df.head())
survived pclass sex age sibsp parch fare embarked
0 0.0 1.0 male 0.271174 0.125 0.0 0.014151 S
1 1.0 0.0 female 0.472229 0.125 0.0 0.139136 C
2 1.0 1.0 female 0.321438 0.000 0.0 0.015469 S
3 1.0 0.0 female 0.434531 0.125 0.0 0.103644 S
4 0.0 1.0 male 0.434531 0.000 0.0 0.015713 S
class who adult_male deck embark_town alive alone
Third man True NaN Southampton no False
First woman False C Cherbourg yes False
Third woman False NaN Southampton yes True
First woman False C Southampton yes False
Third man True NaN Southampton no True
Lưu một Pandas DataFrame thành CSV
Chúng ta sẽ dùng phương thức DataFrame.to_csv() để lưu DataFrame đã chỉnh sửa thành tệp CSV.
new_df.to_csv('new_titanic.csv')
Thao tác này sẽ lưu tệp CSV trong thư mục hiện tại. Nếu bạn cần ôn lại, hãy đọc hướng dẫn này về cách lấy thư mục hiện tại trong Python.
Cách tôi gọi phương thức này đảm bảo tất cả tham số đều được đặt về giá trị mặc định. Giờ tôi sẽ trình bày các tham số và cách bạn có thể thay đổi giá trị của chúng theo nhu cầu.
Giải thích các tham số của DataFrame.to_csv()
Dưới đây là cùng phương thức .to_csv() với đầy đủ các tham số:
new_df.to_csv(
path_or_buf='new_titanic.csv',
sep=',',
na_rep='',
float_format=None,
columns=[],
header=True,
index=True,
index_label=None,
mode='w',
encoding='utf-8',
quoting=csv.QUOTE_MINIMAL,
lineterminator=os.linesep,
storage_options={},
compression='infer',
quotechar='',
chunksize=None,
date_format=None,
doublequote=True,
escapechar=None,
decimal='.',
errors='strict'
)
Một số tham số là tùy chọn, như columns, encoding, quoting, lineterminator và storage_options, nên tôi chỉ đặt giá trị cho chúng, không nhất thiết là giá trị mặc định.
Tham số đầu tiên có thể là một chuỗi, sẽ là tên tệp, hoặc một đối tượng tệp. Xem ví dụ sau:
with open('new_titanic.csv', 'w', encoding = 'utf=8') as file:
new_df.to_csv(file)
Dấu phân tách và giá trị khuyết
Tham số tiếp theo là dấu phân tách, dùng để chỉ cách dữ liệu được ngăn cách. Dấu phân tách mặc định là dấu phẩy, nhưng chúng ta có thể đổi thành tab hoặc dấu chấm phẩy. Tab hoặc dấu chấm phẩy hữu ích khi dữ liệu xuất cần ở một định dạng nhất định. Ngoài ra, với dữ liệu chứa dấu phẩy, như văn bản, dùng dấu phẩy làm dấu phân tách có thể gây ra thay đổi không mong muốn.
Ví dụ, nếu bạn có ‘Hello, world’ làm một điểm dữ liệu, thì nếu muốn dùng dấu phẩy làm phân tách, bạn cũng cần dấu ngoặc kép để giữ nó là một điểm dữ liệu đơn. Dùng tab hoặc dấu chấm phẩy có thể là lựa chọn tốt hơn vì có thể tốn ít bộ nhớ hơn so với dùng dấu phẩy kèm dấu ngoặc kép.
new_df.to_csv('new_titanic.csv', sep = '\t')
new_df_tab = pd.read_csv('new_titanic.csv')
0\t0\t3\tmale\t22.0\t1\t0\t7.25\tS\tThird\tman...
1\t1\t1\tfemale\t38.0\t1\t0\t71.2833\tC\tFirst...
2\t1\t3\tfemale\t26.0\t0\t0\t7.925\tS\tThird\t...
3\t1\t1\tfemale\t35.0\t1\t0\t53.1\tS\tFirst\tw...
4\t0\t3\tmale\t35.0\t0\t0\t8.05\tS\tThird\tman...
Tham số thứ ba, na_rep, chỉ cách biểu diễn các giá trị khuyết. Lựa chọn thường gặp là để trống ô hoặc chèn ‘NaN’ hay ‘Na’, nhưng bạn cũng có thể chèn chuỗi tùy chỉnh. Tôi sẽ chèn ‘Datacamp’ trong ví dụ sau cho mọi giá trị khuyết.
new_df.to_csv('new_titanic.csv', na_rep='Datacamp')
new_df_datacamp = pd.read_csv('new_titanic.csv')
new_df_datacamp = pd.DataFrame(new_df_datacamp)
# tìm các giá trị khuyết
missing_values = new_df_datacamp.isnull().sum()
print(missing_values)
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
Xử lý cột và chỉ mục
Hãy xem các giá trị khuyết được biểu diễn như thế nào ở cột age:
print(new_df_datacamp['age'][:10])
0.2711736617240512
0.4722292033174164
0.32143754712239253
0.4345312892686604
0.4345312892686604
Datacamp
0.6732847449107816
0.01985423473234481
0.33400351847197784
0.17064589092736868
Nếu bạn muốn ít chữ số thập phân hơn, hãy dùng tham số float_format để chỉ định số chữ số thập phân. Ở đây, chúng ta sẽ dùng ba chữ số.
new_df.to_csv('new_titanic.csv', na_rep='Datacamp', float_format='%.3f')
new_df_datacamp = pd.read_csv('new_titanic.csv')
new_df_datacamp = pd.DataFrame(new_df_datacamp)
print(new_df_datacamp['age'][:10])
0.271
0.472
0.321
0.435
0.435
Datacamp
0.673
0.020
0.334
0.171
Nếu bạn không muốn thấy chỉ mục, hãy đặt tham số index thành False.
Bạn cũng có thể quyết định có giữ tên cột hay không bằng tham số header và đặt nó thành True hoặc False (hoặc bạn có thể đặt tên cho các cột).
Tham số columns cho phép bạn chọn những cột cần giữ lại. Tham số index_label cho phép bạn đặt tên cho cột chỉ mục hoặc một danh sách tên nếu bạn có nhiều chỉ mục.
new_df.to_csv(
'new_titanic.csv',
index=True,
header=True,
columns=['age', 'alive'],
index_label='Index'
)
new_df = pd.read_csv('new_titanic.csv')
new_df = pd.DataFrame(new_df)
print(new_df.head())
Index age alive
0 0.271174 no
1 0.472229 yes
2 0.321438 yes
3 0.434531 yes
4 0.434531 no
Mở tệp, mã hóa và nén
Tham số mode cho phép bạn quyết định phải làm gì khi đã có sẵn một tệp CSV trùng tên với tệp bạn đang tạo. Nếu bạn đặt tham số là ‘w’ và đã có tệp new_titanic.csv, tệp bạn tạo sẽ thay thế tệp cũ. Nếu đặt là ‘x’, tệp mới chỉ được tạo nếu chưa tồn tại tệp trùng tên. Cuối cùng, nếu đặt là ‘a’, nội dung mới sẽ được nối thêm vào tệp cũ trùng tên (có thể bạn chỉ muốn thêm một vài hàng).
Tham số encoding thiết lập bảng mã cho tệp mới. Nếu dữ liệu của bạn có chứa ký tự đặc biệt, như chữ cái của các bảng chữ cái khác, bạn có thể đặt là ‘utf-8’ hoặc một bảng mã khác.
Tham số compression thiết lập cách nén cho tệp mới. Mặc định là ‘infer’, nghĩa là nén theo phần mở rộng của tệp, nhưng bạn cũng có thể chỉ định phần mở rộng ưa thích của mình.
# Suy luận kiểu nén
new_df.to_csv('new_titanic.csv.gz')
# Chỉ định kiểu nén một cách tường minh
new_df.to_csv('new_data.csv.gz', compression='gzip')
# Chỉ định kiểu nén qua một dictionary
new_df.to_csv(
'new_data.zip',
compression={
'method': 'zip',
'archive_name': 'data.csv'
}
)
Cách dùng dấu ngoặc kép
Tham số quoting quy định loại dữ liệu nào sẽ được đặt trong ngoặc kép. Như tôi đã nói, khi bạn dùng dấu phẩy làm phân tách và đồng thời có các ô chứa dấu phẩy (như văn bản), bạn phải quyết định những gì cần đặt trong ngoặc kép.
# Giá trị mặc định, chỉ đặt ngoặc cho các trường có ký tự đặc biệt hoặc dấu phân tách như tab và dấu phẩy
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_MINIMAL)
# Đặt ngoặc cho tất cả các trường
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_ALL)
# Chỉ đặt ngoặc cho các trường có giá trị không phải số
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONNUMERIC)
# Không trường nào được đặt ngoặc
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONE)
Kích thước khối và dữ liệu ngày-giờ
Tham số chunksize chỉ định mỗi lần sẽ ghi bao nhiêu dữ liệu vào tệp. Nếu để giá trị mặc định, tất cả các hàng sẽ được ghi cùng lúc, nhưng bạn có thể chỉ định một con số, điều này hữu ích khi tệp rất lớn.
Tham số date_format thiết lập cách biểu diễn các đối tượng datetime. Bạn có thể chỉ định bằng định dạng strftime.
# Ghi DataFrame ra CSV với ngày được định dạng 'MM/DD/YYYY'
new_df.to_csv('new_titanic.csv', date_format='%m/%d/%Y')
# Bạn có thể thiết lập đối tượng datetime đến độ chính xác theo giây
new_df.to_csv('new_titanic.csv', date_format='%Y-%m-%d %H:%M:%S')
Kết luận
Hy vọng giờ đây bạn đã sẵn sàng xuất DataFrame của mình theo định dạng phù hợp với nhu cầu!
Tôi khuyến khích bạn tiếp tục học hỏi—dưới đây là một số tài nguyên bạn có thể thử:

Tôi sắp hoàn thành chương trình thạc sĩ về khoa học dữ liệu tại Đại học Bucharest, Romania, với luận văn về dự đoán lưu lượng giao thông sử dụng các mô hình dựa trên Mạng Nơ-ron Đồ thị. Những kỹ năng chính tôi đã học được gồm làm sạch và trực quan hóa dữ liệu bằng Python và Power BI, tiền xử lý cho nhiều bài toán học máy, và xây dựng mô hình với PyTorch (hoặc TensorFlow). Đồng thời, với tư cách nghiên cứu sinh tiến sĩ ngành triết học, tôi giảng dạy seminar về logic bậc nhất và thực hiện luận án về lý thuyết xác nhận Bayes. Tôi mong muốn học thêm về dữ liệu và xây dựng mô hình, cũng như chia sẻ những gì mình học được.