Chào các member Mì AI, chúng ta lại cùng đi tiếp series về DA-DS nhé. Trong bài trước (tại đây) chúng ta đã tìm hiểu, cài đặt Python và viết một ứng dụng nhỏ để đọc file CSV rồi. Trong bài này chúng ta sẽ cùng thảo luận một số thao tác cơ bản với dữ liệu bằng thư viện Pandas nhé!
Mình cũng xin nhắc lại là Mì Ai cũng xin tiếp cận DA theo một cách hoàn toàn là Mì ăn liền cho hợp phong cách. Các khái niệm sẽ đều được đơn giản hóa để các bạn mới bắt đầu cũng có thể tham khảo và sử dụng được. Mong các cao thủ đi qua xin bỏ quá!
Phần 1 – Khái niệm về Pandas, Series và DataFrame
Về thư viện Pandas
Như đã nói trong buổi trước, cứ nhắc đến DA là có 2 thư viện dùng rõ nhiều là : pandas và numpy. Để các bạn dễ hiểu thì cứ nhớ là :
- pandas: thư viện hỗ trợ đắc lực trong thao tác dữ liệu. Thư viện này được sử dụng rộng rãi trong cả nghiên cứu lẫn phát triển các ứng dụng về khoa học dữ liệu
- numpy : là một thư viện lõi phục vụ cho khoa học máy tính của Python, hỗ trợ cho việc tính toán các mảng nhiều chiều, có kích thước lớn với các hàm đã được tối ưu áp dụng lên các mảng nhiều chiều đó
Để làm việc với 2 thằng này cho tiện thì cứ mở project mới là các bạn cài cắm nó luôn bằng lệnh:
pip install pandas numpy
Về khái niệm Series và Dataframe
Nếu hiểu một cách đơn giản thì Series là các cột trong Excel còn Dataframe chính là một tập hợp các cột và chính là Sheet trong Excels đó. Còn nếu bạn nào đã làm quen với CSDL thì Series là cột còn Dataframe chính là table. Nghe bắt đầu quen thuộc rồi đúng không?
Tuy nhiên có một đặc khác chút cần lưu ý như sau:
- Mỗi df luôn có một cột ngoài cùng bên trái gọi là cột index (chỉ mục) như trong bảng excel thì các bạn nhìn bên tay trái nó cũng có một cái cột tăng dần ấy.
- Index là một chuỗi dữ liệu đứng đầu của Dataframe. Ta có thể set một cột bất kì làm index cho df. Còn nếu không đặt thì hệ thống sẽ sinh ra một cột số tăng dần (0, 1, 2, …,n) làm index cho một dataframe
Dataframe sẽ hay được biểu diễn bằng biến có tên “df” cho dễ gợi nhớ nhé (còn thực ra bạn thích đặt tên gì cho nó cũng được như : vàng, bạc, kim cương hay mì ăn liền…).
Rồi, hiểu mì ăn liền là vậy còn nếu các bạn muốn đọc chuyên sâu hơn thì mình có link sẵn full HD không che nhé: Tại đây
Phần 2 – Giới thiệu một số lệnh thao tác chính trên Dataframe với thư viện Pandas
Ở đây mình cũng nói luôn là thư viện Pandas là khá lớn với vô số các lệnh và riêng việc liệt kê ra thôi cũng đã hết mấy trang A4 kaka. Do đó trong bài này mình chỉ giới thiệu một số lệnh chính để các bạn hình dung cách làm việc với thư viện Pandas như thế nào thôi, các bạn muốn tìm hiểu thêm thì có thể đọc tại link chính thức của Pandas luôn cho máu.
Tạo dataframe
Dataframe có thể tạo ra bằng nhiều cách khác nhau.
Đầu tiên ta có thể tạo df từ một mảng dữ liệu nhập ngay trên phần mềm (cách này thông thường mình cũng không sử dụng vì có xu hướng làm việc với các tệp dữ liệu lớn). Cách tạo ra df bằng cách tạo các mảng dữ liệu cho các cột, từ đó gắn cột vào df. Ví dụ mã nguồn như sau:
# Tạo một dictionary
d = {'col1': [1, 2], 'col2': [3, 4]}
# Tạo một dataframe df1 từ dictionary đó
df1 = pd.DataFrame(data=d)
# Tạo trực tiếp df2 từ lệnh
df2 = pd.DataFrame(np.array([[1, 2], [3, 4]]), columns=['col1', 'col2'])
Code language: PHP (php)
Kết quả của df1 và df2 sẽ có dạng như sau:
col1 col2
0 1 3
1 2 4
Cách thứ hai các bạn có thể load dữ liệu từ file excel, csv vào trong dataframe. Thông thường mình hay dùng file csv để giảm dung lượng dữ liệu đầu vào. Trong bài trước mình đã có hướng dẫn cụ thể về việc này thông qua việc dùng lệnh đọc file dữ liệu như sau:
df = pd.read_csv(path + '\S2_DataFile.csv')
Code language: JavaScript (javascript)
Ngoài ra Python cũng hỗ trợ việc kết nối đến CSDL để lấy thông tin, tùy thuộc loại CSDL để có thể tìm các code tương ứng nhé!
Chúng ta đã xong phần tạo df, bây giờ mình sẽ đi tiếp các lệnh khác của pandas trên df. Để các bạn dễ hiểu mình sẽ nhóm vào theo các nhóm đúng theo tư tưởng của SQL nhé kaka!
Các câu lệnh SELECT
Trong phần này các bạn sẽ dùng các lệnh để in ra dữ liệu trong df (hoặc gán cho biến nào đó khác một phần dữ liệu trích xuất ra của df).
Lệnh in df ra màn hình
# In toàn bộ df ra màn hình
print(df)
# In 10 dòng dầu tiên để kiểm tra dữ liệu
print(df.head())
# In 5 dòng dầu tiên để kiểm tra dữ liệu
print(df.head(5))
# In 10 dòng cuối cùng của dữ liệu
print(df.tail())
Code language: PHP (php)
Đoạn chương trình trên bạn chú ý 2 lệnh là head và tail. Đúng với cái tên của nó, dùng để in ra các bản ghi đầu tiên và cuối cùng (đuôi) của df.
Xem dữ liệu của một cột
Để xem dữ liệu một cột ta sử dụng df [‘<tên danh sách cột>’]. Ví dụ:
# Lấy dữ liệu cột có tên col1 và in ra màn hình
print(df['col1'])
# Lấy 4 dòng đầu tiên của cột col2 và in ra màn hình
print(df['col2'].head(4))
# Lấy dữ liệu 2 cột col1 và col2 đồng thời
print(df['col1','col2'])
Code language: PHP (php)
Xem dữ liệu của một dòng
Để xem dữ liệu của một dòng ta sẽ xem theo index của df. Ví dụ ta có một df như sau:
Bây giờ giả sử muốn lấy các dòng bằng lệnh như sau:
# Lấy dòng có index = 5
print(df.iloc[5])
# Lấy các dòng có index từ 6 đến 10
print(df.iloc[6:11]) # Chú ý là 11 nhé
Code language: PHP (php)
Nếu cột index không phải là số mà là các loại dữ liệu khác thì ta dùng lệnh df.loc. Gỉa sử ta có một df như sau:
Kiểm tra dữ liệu một cột
Đôi khi chúng ta muốn tìm hiểu xem dữ liệu của một cột là gì? Phân phối như thế nào? Min, max ra sao… thì chúng ta dùng lệnh describe như sau:
#ví dụ mã code để xem thông tin của cột GDP trong dataframe #tên là df:
print(df['GDP'].describe())
# Lấy thông tin mô tả của cả df
print(df.describe())
Code language: CSS (css)
Dữ liệu trả về sẽ có dạng một bảng gồm các thông tin và ý nghĩa của các thông tin đó mình có giải thích ở bảng bên dưới.
Nếu muốn tìm hiểu kỹ hơn về các giá trị thống kê, các bạn có thể vào link này nhé.
Lọc dữ liệu trong dataframe
Các bạn cứ hình dùng phần lọc dữ liệu này như là câu SELECT kèm WHERE ấy.
Giả sử ta có một dataframe như sau:
# Lấy các nhân sử ở vùng East
print(df[df['region']=='East'])
# Lấy các nhân viên có sales trên 50000
print(df[df['sales']> 50000])
Code language: PHP (php)
Sắp xếp dữ liệu
Để sắp xếp dữ liệu ta dùng lệnh sort_values() như sau:
# Xếp dữ liệu tăng dần theo cột col1
df.sort_values(by=['col1'])
# Xếp dữ liệu tăng dần theo cột col1 và col2
df.sort_values(by=['col1','col2'])
# Xếp dữ liệu theo thứ tự giảm dần theo cột col1
df.sort_values(by='col1', ascending=False) # Tham số ascending=False
Code language: PHP (php)
Các câu lệnh UPDATE
Update giá trị cột
Gọi là update nhưng thực chất là chúng ta thay đổi giá trị của các cột theo nhu cầu bài toán yêu cầu thôi. Chúng ta có thể thực hiện các thao tác sau:
# Tăng giá trị các ô trong col1 lên 1 đơn vị
df['col1'] = df['col1'] + 1
# Format lại trường dữ liệu thời gian sẽ sử dụng mẫu định dạng như sau '%m/%d/%Y %H:%M:%S'), trong đó m là tháng, d là ngày, Y là năm, H là giờ, M là phút, S là giây
df['REPORT_DATE'] = pandas.to_datetime(df['REPORT_DATE'], format='%m/%d/%Y %H:%M:%S')
Code language: PHP (php)
Thay đổi index của df
Với món này chúng ta có thể thực hiện các thao tác:
# Đặt cột AMOUNT làm index
df = df.set_index("AMOUNT")
# Reset lại index. Sau lệnh này hệ thống sẽ tạo ra một cột tăng dần làm index. Cột index cũ sẽ có tên mới là index_col
df = df.reset_index(name='index_col')
Code language: PHP (php)
Xử lý missing data
Trong quá trình làm việc với dữ liệu hàng ngày chúng ta sẽ gặp rất nhiều dữ liệu bị thiếu (trống, NaN…) và chúng ta phải xử lý nó trước khi có thể tiếp tục làm việc với dữ liệu.
Có 2 cách chính để xử lý cái missing data này là: cắt luôn (Drop) hoặc thay thế (Replace)
Giả sử ta có df như sau:
Bây giờ ta có thể thực hiện drop các missing data bằng lệnh dropna như sau:
# Drop tất cả các dòng có từ 1 giá trị NaN trở lên
df = df.dropna(axis=0, how='any')
# Drop tất cả các cột có từ 1 giá trị NaN trở lên
df = df.dropna(axis=1, how='any')
# Drop tất cả các dòng mà có từ 3 giá trị NaN
df = df.dropna(axis=0, thresh=3)
# Drop tất cả các dòng mà tất cả các giá trị đều là NaN
df = df.dropna(axis=0, how='all')
Code language: PHP (php)
Hoặc cũng có thể replace các NaN values như sau:
# Thay thế các giá trị Nan bằng giá trị 100
df = df.fillna(100)
# Thay thế các giá trị Nan trên cột có tên col1 bằng giá trị 'A'
df['col1'] = df['col1'].fillna('A')
# Thay thế các giá trị Nan trong df bằng giá trị liền sau đó (ở dòng sau)
df = df.fillna(axis=0, method='ffill')
# Thay thế các giá trị Nan trong df bằng giá trị liền trước đó (ở dòng trên)
df = df.fillna(axis=0, method='bfill')
Code language: PHP (php)
Các câu lệnh DELETE
Để xóa dòng hay cột trong pandas ta đều dùng chung một lệnh là drop như sau:
# Xóa cột col1
df = df.drop(['col1'],axis=1) # axis = 1 thể hiện xóa theo cột
# Xóa cột col1 và col2
df = df.drop(columns=['col1','col2'])
# Xóa dòng có index 0 và 1
df = df.drop([0,1])
# Xóa dòng có index = 'Ness' và cột col2
df = df.drop(index='Ness', columns= ['col2'])
Code language: PHP (php)
Các câu lệnh INSERT
Thêm dòng dữ liệu mới
Đê thêm dòng dữ liệu mới vào Dataframe ta dùng lệnh append cho dataframe. Ví dụ:
# Tạo một dòng mới
new_row = {'name':'Nguyen Van A', 'Toan':8.7, 'Hóa':9.2, 'Lý':9.7}
# Thêm dòng vào dataframe
df = df.append(new_row, ignore_index=True) # Thêm ingore_index để cho biết row thêm vào ko có giá trị index.
Code language: PHP (php)
Thêm một cột dữ liệu mới
Việc thêm một cột dữ liệu mới trong dataframe khá đơn giản, các bạn hầu như không cần làm gì mà thực hiện theo kiểu “cứ thế mà gán”. Ví dụ mình có 1 df như sau:
Bây giờ giả sử muốn thêm cột,ta sẽ thực hiện như sau:
# Thêm cột total = cột Listners + cột Plays
df['Total'] = df['Listeners'] + df['Plays']
# Thêm một cột Games có giá trị = 1
df['Games'] = 1
Code language: PHP (php)
Các câu lệnh truy xuất dữ liệu phức tạp hơn
Nhóm dữ liệu
Để nhóm dữ liệu ta dùng lệnh groupby. Giả sử ta có dataframe sau:
Bây giờ ta có thể group theo nhóm như sau:
# Group theo state và tính tổng số score với từng nhóm
print(df.groupby('state')['score'].sum())
# Group theo màu sắc color và tính trung bình height
print(df.groupby('color')['height'].mean())
# Grooup theo 2 trường state và color
print(df.groupby(['state','color'])
Code language: PHP (php)
Pivot table
Cái này mình cũng chưa biết chuyển sang tiếng Việt như nào cho hợp lý. Đại khái là nó tạo ra 1 góc nhìn khác từ một bảng dữ liệu.
Ví dụ ta có dataframe:
Giả sử ta muốn lấy lại thông tin theo tên người làm index, ta sử dụng lệnh:
pd.pivot_table(df,index=["Name"])
Code language: JavaScript (javascript)
pd.pivot_table(df,index=["Name","Rep","Manager"])
Code language: JavaScript (javascript)
Rồi, trên đây là các thao tác chính với dataframe, mình đã liệt kê chỉ với mục đích các bạn có cái nhìn tổng quát về những gì ta có thể làm với dữ liệu. Để tìm hiểu chi tiết các bạn có thể tham khảo tài liệu của pandas và cũng nên hỏi chị Gúc gờ mọi lúc mọi nơi khi cần thiết nhé. Học lập trình chứ không phải học thuộc lòng ngôn ngữ nên các bạn cũng không cần thiết phải cố mà nhớ cho mệt.
Trong các bài tiếp theo chúng ta sẽ học cách vẽ các loại đồ thị với pandas và matplotlib nhé. Hẹn gặp lại các bạn!
Hãy join cùng cộng đồng Mì AI nhé!
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube
3 Replies to “[DA-DS #2] Các thao tác cơ bản với dữ liệu bằng thư viện Pandas”