Kiểm tra xem các bảng nguồn hoặc truy vấn lồng nhau của bạn có các hàng trùng lặp không. Bạn sẽ cần lặp lại bước 3 và 4 cho mọi bảng hoặc kết quả truy vấn chứa các hàng trùng lặp -- If the row_count is greater than 1,
-- you have duplicated rows in your results.
SELECT
< your_columns >,
COUNT(*) AS row_count
FROM
< your_table_or_upstream_query >
GROUP BY
< your_columns >
ORDER BY
row_count DESC;
Kiểm tra của bạn để xem cách tham gia của bạn tương tác với các mối quan hệ bảng của bạn.Giải trình Các hàng có thể vô tình bị trùng lặp khi dữ liệu được làm mới trong các hệ thống ngược dòng hoặc công việc ETL Một số bảng có hàng trông giống như trùng lặp trong nháy mắt. Điều này phổ biến với các bảng theo dõi các thay đổi trạng thái (e. g. , một bảng trạng thái đơn hàng sẽ thêm một hàng mỗi khi trạng thái thay đổi). Các bảng trạng thái có thể có các hàng giống hệt nhau, ngoại trừ dấu thời gian của hàng. Có thể khó phát hiện nếu bạn có các bảng có nhiều cột, vì vậy hãy nhớ thực hiện qua Bước 2 ở trên hoặc hỏi quản trị viên cơ sở dữ liệu của bạn nếu bạn không chắc chắn Nếu bạn đã viết các phép nối của mình giả sử một mối quan hệ cho các bảng thực sự có mối quan hệ hoặc, thì bạn sẽ nhận được các hàng trùng lặp cho mỗi kết quả khớp trong bảng "nhiều" đọc thêm - Kết hợp các bảng với phép nối
- Lược đồ là gì?
- Mối quan hệ bảng cơ sở dữ liệu
Tham gia các loại và các mối quan hệ bảngBảng này tóm tắt cách các loại liên kết tương tác với các mối quan hệ của bảng để tạo ra các bản sao khi tìm thấy các hàng phù hợp +----------------+------------------------+-----------------------------------+------------------------------+
| | A is one-to-one with B | A is one-to-many with B | A is many-to-many with B |
+----------------+------------------------+-----------------------------------+------------------------------+
| A INNER JOIN B | No duplicate rows. | No duplicate rows. | Duplicated rows from A or B. |
+----------------+------------------------+-----------------------------------+------------------------------+
| A LEFT JOIN B | No duplicate rows. | Possible duplicates from table B. | Duplicated rows from A or B. |
+----------------+------------------------+-----------------------------------+------------------------------+
| B LEFT JOIN A | No duplicate rows. | Possible duplicates from table B. | Duplicated rows from A or B. |
+----------------+------------------------+-----------------------------------+------------------------------+
| A OUTER JOIN B | No duplicate rows. | Possible duplicates from table B. | Duplicated rows from A or B. |
+----------------+------------------------+-----------------------------------+------------------------------+
| A FULL JOIN B | No duplicate rows. | Duplicate rows from table B. | Duplicated rows from A or B. |
+----------------+------------------------+-----------------------------------+------------------------------+
Làm thế nào để giảm các mối quan hệ bảngNếu bạn có các hàng trùng lặp vì bạn đang giả định một mối quan hệ trong khi thực tế bạn có các bảng là hoặc , thì bạn có thể xóa các hàng trùng lặp bằng cách sử dụng Câu hỏi cuối cùng của tôi là làm thế nào để có một giải pháp hoàn hảo cho việc này, có thể thêm một quy tắc định dạng có điều kiện khác sẽ kiểm tra từ dưới cùng bên phải lên trên cùng bên trái. Nhưng quy tắc này sẽ phải được nhúng trong quy tắc đầu tiên, nếu không nó sẽ ghi đè lên "bỏ qua lần xuất hiện đầu tiên". (nó vẫn có thể làm điều đó nếu nó được nhúng, tôi không chắc) Hồi đáp Trong quá trình tiền xử lý và phân tích dữ liệu, bạn thường sẽ cần tìm hiểu xem liệu mình có dữ liệu trùng lặp hay không và cách xử lý chúng Trong bài viết này, bạn sẽ tìm hiểu hai phương pháp, >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 và >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 4, để tìm và xóa các hàng trùng lặp, cũng như cách sửa đổi hành vi của chúng cho phù hợp với nhu cầu cụ thể của bạn. Bài báo này có cấu trúc như sau- Tìm hàng trùng lặp
- Đếm các hàng trùng lặp và không trùng lặp
- Trích xuất các hàng trùng lặp với
>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 5 - Xác định bản sao nào cần đánh dấu bằng
>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 - Xoá các hàng trùng lặp
Để trình diễn, chúng tôi sẽ sử dụng một tập hợp con từ bộ dữ liệu Titanic có sẵn trên Kaggle import pandas as pddef load_data(): df_all = pd.read_csv('train.csv') # Take a subset return df_all.loc[:300, ['Survived', 'Pclass', 'Sex', 'Cabin', 'Embarked']].dropna()df = load_data() hình ảnh của tác giảVui lòng kiểm tra Notebook để biết mã nguồn 1. Tìm hàng trùng lặp Để tìm các bản sao trên một cột cụ thể, chúng ta chỉ cần gọi phương thức >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 trên cột>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool Kết quả là một Sê-ri boolean có giá trị >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 biểu thị trùng lặp. Nói cách khác, giá trị >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 có nghĩa là mục này giống với mục trước đóĐể xem toàn bộ sự trùng lặp trong DataFrame, chỉ cần gọi phương thức >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 trên DataFrame. Nó xuất ra >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 nếu toàn bộ một hàng giống với hàng trước đó>>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool Để xem xét các cột nhất định để xác định các bản sao, chúng ta có thể chuyển danh sách các cột cho đối số >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 2>>> df.duplicated(subset=['Survived', 'Pclass', 'Sex'])0 False 1 False 9 False 10 True 14 True .. 271 True 278 True 286 True 299 True 300 True Length: 80, dtype: bool 2. Đếm số trùng lặp và không trùng lặpKết quả của >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 là một Sê-ri boolean và chúng tôi có thể cộng chúng lại để đếm số lượng trùng lặp. Đằng sau chủ đề, >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 được chuyển đổi thành >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 5 và >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 6 được chuyển đổi thành >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 7, sau đó cộng chúng lại# Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 Giống như trước đây, chúng ta có thể đếm số trùng lặp trong DataFrame và trên các cột nhất định # Count duplicate in a DataFrame >>> df.duplicated().sum() 3# Count duplicate on certain columns >>> df.duplicated(subset=['Survived', 'Pclass', 'Sex']).sum() 70 Nếu bạn muốn đếm số lượng không trùng lặp (Số lượng của >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 6), bạn có thể đảo ngược nó bằng cách phủ định (>>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 9) rồi gọi >>> df.duplicated(subset=['Survived', 'Pclass', 'Sex'])0 False 1 False 9 False 10 True 14 True .. 271 True 278 True 286 True 299 True 300 True Length: 80, dtype: bool 0# Count the number of non-duplicates >>> (~df.duplicated()).sum() 77 3. Trích xuất các hàng trùng lặp với >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 5Pandas >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 trả về một Sê-ri boolean. Tuy nhiên, sẽ không thực tế khi xem danh sách >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 và >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 6 khi chúng tôi cần thực hiện một số phân tích dữ liệuChúng tôi có thể sử dụng bộ chọn dữ liệu >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 5 của Pandas để trích xuất các hàng trùng lặp đó# Extract duplicate rows df.loc[df.duplicated(), :] hình ảnh của tác giả>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 5 có thể lấy Sê-ri boolean và lọc dữ liệu dựa trên >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 và >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 6. Đối số đầu tiên >>> df.duplicated(subset=['Survived', 'Pclass', 'Sex'])0 False 1 False 9 False 10 True 14 True .. 271 True 278 True 286 True 299 True 300 True Length: 80, dtype: bool 9 sẽ tìm các hàng được xác định bởi >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3. Đối số thứ hai # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 1 sẽ hiển thị tất cả các cột4. Xác định bản sao nào cần đánh dấu bằng >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6Có một đối số >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 trong Pandas >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 để xác định những bản sao nào cần đánh dấu. >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 mặc định là # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 6, có nghĩa là lần xuất hiện đầu tiên được giữ lại và tất cả những lần xuất hiện khác được xác định là trùng lặpChúng tôi có thể thay đổi nó thành # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 7 giữ lần xuất hiện cuối cùng và đánh dấu tất cả những cái khác là trùng lặphình ảnh của tác giảCó một tùy chọn thứ ba chúng ta có thể sử dụng # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 8. Nó đánh dấu tất cả các hàng trùng lặp là >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 8 và cho phép chúng tôi xem tất cả các hàng trùng lặphình ảnh của tác giả5. Xoá các hàng trùng lặpChúng ta có thể sử dụng phương thức tích hợp sẵn của Pandas >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 4 để loại bỏ các hàng trùng lặpdf.drop_duplicates() hình ảnh của tác giảLưu ý rằng chúng tôi đã bắt đầu với 80 hàng, bây giờ là 77. Theo mặc định, phương thức này trả về một DataFrame mới với các hàng trùng lặp đã bị xóa. Chúng tôi có thể đặt đối số # Count duplicate in a DataFrame >>> df.duplicated().sum() 3# Count duplicate on certain columns >>> df.duplicated(subset=['Survived', 'Pclass', 'Sex']).sum() 70 1 để xóa các bản sao khỏi Khung dữ liệu gốcdf.drop_duplicates(inplace=True) Xác định bản sao nào cần giữĐối số >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 cũng có thể được đặt cho >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 4 để xác định những bản sao nào cần giữ lại. Nó mặc định là # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 6 để giữ lần xuất hiện đầu tiên và loại bỏ tất cả các bản sao khácTương tự, chúng ta có thể đặt >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 thành # Count duplicate on a column >>> df.Cabin.duplicated().sum() 11 7 để giữ lần xuất hiện cuối cùng và loại bỏ các bản sao khác>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 0Và chúng tôi có thể đặt >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 6 thành >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 6 để loại bỏ tất cả các bản sao>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 1Xem xét các cột nhất định để loại bỏ các bản saoTương tự, để xem xét các cột nhất định để loại bỏ các bản sao, chúng ta có thể chuyển danh sách các cột cho đối số >>> df.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Length: 80, dtype: bool 2>>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 2Kết luậnPandas >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 và >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 4 là hai phương pháp nhanh chóng và thuận tiện để tìm và loại bỏ các bản sao. Điều quan trọng là phải biết chúng vì chúng ta thường cần sử dụng chúng trong quá trình tiền xử lý và phân tích dữ liệuTôi hy vọng bài viết này sẽ giúp bạn tiết kiệm thời gian trong việc học Pandas. Tôi khuyên bạn nên xem tài liệu về API >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 3 và >>> df.Cabin.duplicated()0 False 1 False 9 False 10 False 14 False .. 271 False 278 False 286 False 299 False 300 False Name: Cabin, Length: 80, dtype: bool 4 và để biết về những điều khác mà bạn có thể làmCảm ơn vì đã đọc. Vui lòng kiểm tra sổ ghi chép để biết mã nguồn và tiếp tục theo dõi nếu bạn quan tâm đến khía cạnh thực tế của máy học |