Pandas là một thư viện phổ biến trong Python sử dụng cho các tác vụ liên quan đến dữ liệu. Pandas cung cấp các cấu trúc dữ liệu và công cụ để thao tác các bảng dữ liệu (dataframe) một cách hiệu quả. Trong bài viết này, bạn sẽ học cách viết mã hiệu quả và dễ bảo trì với Pandas.
Phần 1: Sử dụng các hàm được tích hợp trong Pandas
Pandas cung cấp nhiều hàm được tích hợp để thực hiện các tác vụ thường gặp. Việc sử dụng các hàm này sẽ giúp cho bạn viết mã hiệu quả, ngắn gọn và dễ đọc hơn. Ví dụ:
DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
Code ví dụ:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': [9, 10, 11, 12]})
df.fillna(value=0, inplace=True)
print(df)
Điều này sẽ tạo ra đầu ra sau đây:
A B C
0 1.0 5.0 9
1 2.0 0.0 10
2 0.0 0.0 11
3 4.0 8.0 12
Phần 2: Sử dụng Pandas cho dữ liệu lớn
Nếu bạn đang làm việc với các tệp tin dữ liệu lớn, bạn có thể sử dụng tính năng đọc tệp tin của Pandas. Hãy tránh sử dụng hàm read_csv để đọc toàn bộ tệp tin vào bộ nhớ. Thay vào đó, sử dụng các tính năng như chunksize để đọc từng phần của tệp tin.
Ví dụ:
import pandas as pd
chunksize = 10 ** 6
for chunk in pd.read_csv('large_file.csv', chunksize=chunksize):
process(chunk)
Phần 3: Cách sử dụng GroupBy theo nhiều kiểu
GroupBy là một phương pháp quan trọng trong Pandas, để phân nhóm dữ liệu theo một số thuộc tính giống nhau. Sử dụng GroupBy đến nhiều phân nhóm sẽ giúp tiết kiệm thời gian thực hiện tác vụ, thay vì sử dụng các vòng lặp riêng biệt cho từng phân nhóm.
Ví dụ:
#Sử dụng GroupBy để tính tổng trên một trường cho từng nhóm
import pandas as pd
df = pd.DataFrame({
'key1': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'A'],
'key2': ['C', 'C', 'D', 'D', 'C', 'D', 'C', 'D'],
'data1': [1, 2, 3, 4, 5, 6, 7, 8],
'data2': [10, 20, 30, 40, 50, 60, 70, 80]
})
grouped = df.groupby('key1')
for name, group in grouped:
print(name)
print(group)
Điều này sẽ tạo ra đầu ra sau đây:
A
key1 key2 data1 data2
0 A C 1 10
2 A D 3 30
4 A C 5 50
6 A C 7 70
7 A D 8 80
B
key1 key2 data1 data2
1 B C 2 20
3 B D 4 40
5 B D 6 60
Phần 4: Thực hiện truy vấn dữ liệu nhanh chóng
Việc truy vấn dữ liệu rất cần thiết. Để đạt được hiệu quả khi truy vấn dữ liệu, hãy sử dụng các phương thức như query(), loc[] và iloc[]
Để truy cập dữ liệu một cách nhanh chóng và đơn giản. Sử dụng whee() khi có nhu cầu truy vấn phức tạp hơn.
Ví dụ:
#Truy vấn dữ liệu bằng cách sử dụng query()
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['X', 'Y', 'Z', 'X', 'Y']
})
qr = df.query('A > 2 and B == "X"')
print(qr)
Điều này sẽ tạo ra đầu ra sau đây:
A B
3 4 X
Phần 5: Hiệu quả khi đưa dữ liệu vào cơ sở dữ liệu
Khi làm việc với dữ liệu lớn, việc hiệu quả hóa việc truy vấn dữ liệu rất quan trọng vì:
- Cung cấp kết quả nhanh hơn trong cơ sở dữ liệu SQL, giúp tiết kiệm thời gian và tăng hiệu suất cho người dùng
- Giảm chi phí cho mỗi truy vấn xử lý, giúp tiết kiệm tài nguyên hệ thống và tăng khả năng mở rộng cho ứng dụng
- Giảm áp lực xử lý của cơ sở dữ liệu, giúp duy trì tính ổn định và an toàn cho dữ liệu
- Tiêu thụ ít bộ nhớ hơn cho việc xử lý truy vấn, giúp tăng khả năng đáp ứng cho các yêu cầu phức tạp
- Cải thiện hiệu năng tổng thể của hệ thống, giúp tạo ra các báo cáo và phân tích có giá trị cho doanh nghiệp
Vì vậy, bạn nên cân nhắc đưa dữ liệu vào cơ sở dữ liệu để truy xuất dữ liệu một cách nhanh chóng.
Ví dụ:
# Đưa dữ liệu DataFrame vào cơ sở dữ liệu
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['X', 'Y', 'Z', 'X', 'Y']
})
conn = engine.connect()
df.to_sql('my_table', conn)
print(df)
Bây giờ có thể truy vấn cơ sở dữ liệu bằng cách sử dụng câu lệnh SQL thông qua pandas:
from sqlalchemy import text
engine = create_engine('sqlite:///:memory:')
...
df.to_sql('my_table', conn)
result = pd.read_sql_query(text("SELECT * from my_table WHERE A > 2"), conn)
print(result)
Phần 6: Tránh việc sử dụng một quá trình thay đổi dữ liệu không cần thiết
Khi làm việc với dữ liệu, hãy tránh việc sử dụng một quá trình thay đổi dữ liệu không cần thiết. Thay vào đó, hãy sử dụng cấu trúc dữ liệu copy để tiết kiệm thời gian. Cấu trúc dữ liệu copy là một bản sao của cấu trúc dữ liệu gốc, nhưng không chia sẻ bộ nhớ với nó. Điều này có nghĩa là khi bạn thay đổi cấu trúc dữ liệu copy, bạn sẽ không ảnh hưởng đến cấu trúc dữ liệu gốc
Ví dụ:
#Sử dụng cấu trúc dữ liệu copy để tiết kiệm thời gian:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8]
})
df2 = df1.copy()
#Thay các giá trị NaN trong cột A bằng số 0
df2['A'].fillna(0, inplace=True)
print(df1)
print(df2)
Điều này sẽ tạo ra đầu ra sau đây:
Original DataFrame:
A B
0 1.0 5.0
1 2.0 NaN
2 NaN NaN
3 4.0 8.0
Updated DataFrame:
A B
0 1.0 5.0
1 2.0 NaN
2 0.0 NaN
3 4.0 8.0
Phần 7: Sử dụng Inplace khi cần phải thay đổi dữ liệu
Nếu dữ liệu của bạn rất lớn, bạn nên sử dụng inplace bên trong hàm Pandas như drop() hoặc fillna() để tránh tạo bản sao của bộ nhớ. Việc sử dụng inplace sẽ ghi đè trực tiếp lên bộ nhớ được đọc, từ đó giúp cho việc xử lý dữ liệu trở nên nhanh hơn.
Tham số inplace cho biết liệu hàm có thay đổi trực tiếp DataFrame ban đầu hay không. Nếu inplace là True, thì DataFrame ban đầu sẽ bị ghi đè bởi kết quả của hàm. Nếu inplace là False (mặc định), thì DataFrame ban đầu sẽ không bị thay đổi, và hàm sẽ trả về một DataFrame mới chứa kết quả của hàm
Ví dụ:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8]
})
#Điền vào các giá trị bị thiếu bằng số 0
df1.fillna(value=0, inplace=True)
print(df1)
Điều này sẽ tạo ra đầu ra sau đây:
A B
0 1.0 5.0
1 2.0 0.0
2 0.0 0.0
3 4.0 8.0
Chúc các bạn viết mã hiệu quả với thư viện Pandas trong Python!
Bài trước: Xử lý dữ liệu lớn với Pandas
Quay về trang chủ của khoá học: Python Pandas – Thao tác và phân tích dữ liệu
