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;
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ảng
Bả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ảng
Nế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 đápTrong 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: bool3 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: bool4, để 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: bool5 - 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: bool6 - 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: bool3 trên cột
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: bool8 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: bool8 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: bool3 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: bool8 nếu toàn bộ một hàng giống với hàng trước đó
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: bool2
1 False
9 False
10 True
14 True
..
271 True
278 True
286 True
299 True
300 True
Length: 80, dtype: bool2. Đếm số trùng lặp và không trùng lặp
Kế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: bool3 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: bool8 đượ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: bool5 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: bool6 đượ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: bool7, sau đó cộng chúng lại
>>> 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: bool6), 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: bool9) 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: bool0
>>> (~df.duplicated()).sum()
773. 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: bool5
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: bool3 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: bool8 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: bool6 khi chúng tôi cần thực hiện một số phân tích dữ liệu
Chú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: bool5 của Pandas để trích xuất các hàng trùng lặp đó
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: bool5 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: bool8 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: bool6. Đố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: bool9 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: bool3. Đối số thứ hai # Count duplicate on a column
>>> df.Cabin.duplicated().sum()
111 sẽ hiển thị tất cả các cột
1 False
9 False
10 False
14 False
..
271 False
278 False
286 False
299 False
300 False
Name: Cabin, Length: 80, dtype: bool6
Có 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: bool6 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: bool3 để 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: bool6 mặc định là # Count duplicate on a column
>>> df.Cabin.duplicated().sum()
116, 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ặp
Chúng tôi có thể thay đổi nó thành # Count duplicate on a column
>>> df.Cabin.duplicated().sum()
117 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ặp
hì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()
118. 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: bool8 và cho phép chúng tôi xem tất cả các hàng trùng lặp
hình ảnh của tác giả5. Xoá các hàng trùng lặp
Chú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: bool4 để loại bỏ các hàng trùng lặp
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()
701 để xóa các bản sao khỏi Khung dữ liệu gốc
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: bool6 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: bool4 để 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()
116 để giữ lần xuất hiện đầu tiên và loại bỏ tất cả các bản sao khác
Tươ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: bool6 thành # Count duplicate on a column
>>> df.Cabin.duplicated().sum()
117 để giữ lần xuất hiện cuối cùng và loại bỏ các bản sao khác
1 False
9 False
10 False
14 False
..
271 False
278 False
286 False
299 False
300 False
Name: Cabin, Length: 80, dtype: bool0
Và 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: bool6 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: bool6 để loại bỏ tất cả các bản sao
1 False
9 False
10 False
14 False
..
271 False
278 False
286 False
299 False
300 False
Name: Cabin, Length: 80, dtype: bool1
Xem xét các cột nhất định để loại bỏ các bản sao
Tươ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: bool2
1 False
9 False
10 False
14 False
..
271 False
278 False
286 False
299 False
300 False
Name: Cabin, Length: 80, dtype: bool2Kết luận
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: bool3 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: bool4 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ệu
Tô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: bool3 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: bool4 và để biết về những điều khác mà bạn có thể làm
Cả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