Làm cách nào để kiểm tra các mức hàng trùng lặp?

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ả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 đá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

    1. Tìm hàng trùng lặp
    2. Đếm các hàng trùng lặp và không trùng lặp
    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
      5
    4. 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
    5. 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ặ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: 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
    5

    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 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ệ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: 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ột

    4. 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

    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: 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ặp

    Chú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ặ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()
    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ặ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: bool
    4 để loại bỏ các hàng trùng lặp

    df.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ốc

    df.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á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: 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
    0

    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: 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
    1

    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: 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ậ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: 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ệ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: 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à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