Điều quan trọng là có thể trích xuất, lọc và chuyển đổi dữ liệu từ DataFrames để đi sâu vào dữ liệu thực sự quan trọng. Thư viện pandas có nhiều kỹ thuật giúp quá trình này trở nên hiệu quả và trực quan. Và trong bài viết hôm nay mình sẽ liệt kê những kỹ thuật đó kèm theo code mẫu và một số giải thích. Bắt đầu nào
Đối với bài viết này, tôi đã tạo một DataFrame mẫu với các số ngẫu nhiên để chơi với nó. Chúng tôi sẽ sử dụng dữ liệu này làm ví dụ trong phần giải thích trong bài viết
import pandas as pd
import numpy as np
cols = ['col0', 'col1', 'col2', 'col3', 'col4']
rows = ['row0', 'row1', 'row2', 'row3', 'row4']
data = np.random.randint[0, 100, size=[5, 5]]
df = pd.DataFrame[data, columns=cols, index=rows]
df.head[]
Out[2]: col0 col1 col2 col3 col4 row0 24 78 42 7 96 row1 40 4 80 12 84 row2 83 17 80 26 15 row3 92 68 58 93 33 row4 78 63 35 70 95
Lập chỉ mục DataFrames
Để trích xuất dữ liệu từ pandas DataFrame, chúng ta có thể sử dụng bộ truy cập hoặc lập chỉ mục trực tiếp. Chúng tôi có thể chọn các hàng và cột cần thiết bằng nhãn của nó
df['col1']['row1']
Out[3]: 4
Vui lòng lưu ý thứ tự trong loại lập chỉ mục này. đầu tiên bạn chỉ định nhãn cột và sau đó hàng. Nhưng sự thật là, các bộ dữ liệu rất hiếm và nhỏ, trong khi trong cuộc sống thực, chúng ta làm việc với máy móc nặng hơn nhiều. Sẽ tốt hơn nhiều nếu chọn dữ liệu bằng cách sử dụng bộ truy cập –. định vị và. iloc. Sự khác biệt giữa chúng là. loc chấp nhận nhãn và. iloc – chỉ số. Ngoài ra, khi chúng tôi sử dụng bộ truy cập, trước tiên chúng tôi chỉ định hàng và sau đó là cột. Tôi đã có một khoảng thời gian khó khăn khi bắt đầu làm quen với nó – Nền tảng SQL, bạn có thể nói gì nữa
Vì vậy, để chọn một giá trị bằng cách sử dụng bộ truy cập, bạn sẽ làm như sau
df.loc['row4', 'col2']
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Sử dụng lập chỉ mục, chúng tôi có thể chọn một giá trị, Sê-ri hoặc Khung dữ liệu từ Khung dữ liệu [xin lỗi vì sự lặp lại]. Ở trên tôi đã trình bày cách chọn giá trị
Để chọn một vài cột, chỉ cần chuyển danh sách lồng nhau của các nhãn và DataFrame sẽ được trả về
df_new = df[['col1','col2']]
df_new.head[3]
Out[6]: col1 col2 row0 78 42 row1 4 80 row2 17 80
Nếu bạn cũng muốn chọn các hàng cụ thể, hãy thêm các chỉ mục của nó và bạn sẽ nhận lại DataFrame. Kỹ thuật này được gọi là cắt lát và chi tiết hơn về nó – bên dưới
df_new = df[['col1','col2']][1:4]
df_new.head[3]
Out[7]: col1 col2 row1 4 80 row2 17 80 row3 68 58
Để chọn Sê-ri, bạn phải chọn một cột có tất cả hoặc phạm vi hàng. Mỗi dòng mã sẽ tạo ra cùng một đầu ra
df['col0']
df.loc[:,'col0']
df.iloc[:, 0]
Out[8]: row0 24 row1 40 row2 83 row3 92 row4 78 Name: col0, dtype: int32
Dấu hai chấm có nghĩa là chúng tôi muốn chọn tất cả các hàng hoặc tất cả các cột – df. lộc [. ,. ] hoặc df. iloc[. ,. ] sẽ trả về tất cả các giá trị. Và dần dần chúng tôi đã cắt lát - chọn các phạm vi cụ thể từ dữ liệu của chúng tôi. Để cắt một Sê-ri, bạn chỉ cần thêm một dải hàng mà bạn muốn chọn bằng chỉ mục của nó
df['col3'][2:5]
Out[12]: row2 26 row3 93 row4 70 Name: col3, dtype: int32
Và đừng quên về phạm vi trong Python – bao gồm phần tử đầu tiên, loại trừ phần tử thứ hai. Vì vậy, đoạn mã trên sẽ trả về các hàng có chỉ số 5, 6, 7, 8 và 9. Và các chỉ mục bắt đầu từ 0
Cắt DataFrames hoạt động theo cùng một cách. Chỉ với một sắc thái. Khi đang sử dụng. loc [nhãn] cả hai đường viền được bao gồm. Ví dụ: chọn các hàng từ nhãn 'row1' đến nhãn 'row4' hoặc từ chỉ mục hàng 1 đến chỉ mục 4 và tất cả các cột
df.loc['row1':'row4', :]
Out[20]: col0 col1 col2 col3 col4 row1 40 4 80 12 84 row2 83 17 80 26 15 row3 92 68 58 93 33 row4 78 63 35 70 95
df.iloc[1:4, :]
Out[21]: col0 col1 col2 col3 col4 row1 40 4 80 12 84 row2 83 17 80 26 15 row3 92 68 58 93 33
Dòng mã đầu tiên phía trên đã chọn hàng1, hàng2, hàng3 và hàng4. Trong khi hàng thứ hai – chỉ hàng1, hàng2 và hàng3. Và một vài ví dụ khác dưới đây
Chọn các cột từ nhãn 'col1' đến nhãn 'col4' hoặc từ chỉ mục cột 1 đến chỉ mục 4 và tất cả các hàng
________số 8Chọn các hàng từ nhãn 'hàng1' đến nhãn 'hàng 4' hoặc từ chỉ mục hàng 1 đến chỉ mục 4 và cột từ nhãn 'col1' đến nhãn 'col4' hoặc từ chỉ mục cột 1 đến chỉ mục 4
df.loc['row1':'row4', 'col1':'col4']
Out[24]: col1 col2 col3 col4 row1 4 80 12 84 row2 17 80 26 15 row3 68 58 93 33 row4 63 35 70 95
df.iloc[1:4,1:4]
Out[25]: col1 col2 col3 row1 4 80 12 row2 17 80 26 row3 68 58 93
Sử dụng danh sách để chọn các cột hoặc hàng cụ thể không nằm trong một phạm vi
df['col1']['row1']0
Out[3]: 4
Lọc khung dữ liệu
Lọc là một công cụ tổng quát hơn để chọn các phần của dữ liệu dựa trên các thuộc tính quan tâm của chính dữ liệu chứ không phải trên các chỉ mục hoặc nhãn. DataFrames có một số phương pháp để lọc. Ý tưởng cơ bản cho tất cả các phương pháp này là Chuỗi Boolean. df[‘col1’] > 20 [chúng tôi giả sử col1 có kiểu số nguyên] sẽ trả về một Chuỗi Boolean khi điều kiện này là đúng. Tôi sẽ đặt ở đây đầu ra của. head[], vì vậy bạn không cần cuộn lên để khớp các số
df['col1']['row1']1
Out[3]: 4
Vì vậy, để chọn một phần của DataFrame trong đó các giá trị của col1 lớn hơn 20, chúng tôi sẽ sử dụng đoạn mã sau
df['col1']['row1']2
Out[3]: 4
Chúng ta có thể kết hợp các bộ lọc đó bằng các toán tử logic tiêu chuẩn [và – &, hoặc –. , không phải – ~]. Lưu ý việc sử dụng dấu ngoặc đơn cho các hoạt động này
df['col1']['row1']3
Out[3]: 4
Xử lý các giá trị 0 và NaN
Hầu như các bộ dữ liệu luôn có giá trị bằng 0 hoặc NaN và chúng tôi chắc chắn muốn biết chúng ở đâu. Của chúng tôi là đặc biệt, vì vậy chúng tôi sẽ sửa đổi nó một chút
df['col1']['row1']4
Out[3]: 4
Để chọn các cột không có bất kỳ giá trị 0 nào, chúng ta có thể sử dụng. phương thức all[] [có tất cả dữ liệu]
df['col1']['row1']5
Out[3]: 4
Nếu chúng tôi muốn tìm một cột có ít nhất một giá trị khác không [bất kỳ], điều này sẽ giúp
df['col1']['row1']6
Out[3]: 4
Để chọn các cột có bất kỳ NaN nào
df['col1']['row1']7
Out[3]: 4
Chọn các cột không có NaN
df['col1']['row1']8
Out[3]: 4
Chúng tôi có thể loại bỏ các hàng chứa NaN, nhưng đây là một trò chơi nguy hiểm – loại bỏ thường không phải là một giải pháp. Bạn phải hiểu dữ liệu của mình và xử lý các hàng như vậy một cách khôn ngoan. tôi đã cảnh báo bạn
Bạn có chắc là bạn muốn biết nó? . 😀
df['col1']['row1']9
Out[3]: 4
Phương pháp này không sửa đổi DataFrame gốc, vì vậy để tiếp tục làm việc với dữ liệu đã lọc, bạn phải gán nó cho khung dữ liệu mới hoặc gán lại cho khung dữ liệu hiện có
df.loc['row4', 'col2']0
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Cái hay của lọc là chúng ta thực sự có thể chọn hoặc sửa đổi giá trị của một cột dựa trên một cột khác. Ví dụ: chúng ta có thể chọn các giá trị từ col1 trong đó col2 lớn hơn 35 và cập nhật các giá trị đó bằng cách thêm 5 vào mỗi giá trị
df.loc['row4', 'col2']1
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Và điều này đưa chúng ta đến phần tiếp theo –
Chuyển đổi khung dữ liệu
Khi chúng tôi đã chọn hoặc lọc dữ liệu của mình, chúng tôi muốn chuyển đổi dữ liệu đó bằng cách nào đó. Cách tốt nhất để làm điều này là sử dụng các phương thức được kế thừa từ DataFrames hoặc các chức năng phổ quát gọn gàng, giúp chuyển đổi toàn bộ cột dữ liệu theo từng phần tử. Ví dụ sẽ là gấu trúc '. hàm floordiv[] [từ tài liệu.
'Phân chia số nguyên của khung dữ liệu và phần tử khác'] hoặc numpy's. floor_divide[] [doc. ‘Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng phép chia các đầu vào. ’].
Nếu các chức năng đó không có sẵn, chúng tôi có thể viết chức năng của riêng mình và sử dụng nó với. phương pháp áp dụng []
df.loc['row4', 'col2']2
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Các hàm này không trả về các phép biến đổi, vì vậy chúng ta phải lưu trữ nó một cách rõ ràng
df.loc['row4', 'col2']3
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Nếu chỉ mục là một chuỗi nó có một. trình truy cập str cho phép chúng tôi sửa đổi toàn bộ chỉ mục cùng một lúc
df.loc['row4', 'col2']4
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Ngoài ra, chúng ta không thể sử dụng. apply[] phương thức trên chỉ mục - thay thế cho nó là. bản đồ[]
df.loc['row4', 'col2']5
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Nhưng mà. map[] cũng có thể được sử dụng trên các cột. Ví dụ
df.loc['row4', 'col2']6
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Các phép toán số học trên Sê-ri và DataFrames hoạt động trực tiếp. Biểu thức bên dưới sẽ tạo một cột mới trong đó mỗi giá trị có chỉ số n là tổng của các giá trị có chỉ số n từ 'col3' và 'col7'
df.loc['row4', 'col2']7
Out[4]: 35
df.iloc[rowindex, colindex] ==> df.iloc[4, 2]
Out[5]: 35
Đây là phiên bản thứ hai của bài viết, vì phiên bản đầu tiên hoàn toàn là một mớ hỗn độn – lỗi trong mã, không có ví dụ và một số thứ khác. Nhờ phản hồi mà tôi đã xem lại bài viết một lần nữa và tôi nghĩ bây giờ nó đã tốt hơn nhiều. Tôi đã trình bày những điều cơ bản về chuyển đổi và trích xuất dữ liệu trong Python bằng các đoạn mã và ví dụ ở đây và hy vọng nó sẽ hữu ích cho những người mới bắt đầu con đường của họ trong lĩnh vực này
Trong khi đó, hãy yêu khoa học dữ liệu và cười nhiều hơn. Chúng ta phải tích cực vì chúng ta đang có công việc quyến rũ nhất thế kỷ 21 😀