Xử lý các giá trị trùng lặp trong Pandas DataFrame

Xử lý các giá trị trùng lặp trong Pandas DataFrame

Giới thiệu

Là một nhà phân tích dữ liệu, chúng tôi có trách nhiệm đảm bảo tính toàn vẹn của dữ liệu để có được thông tin chi tiết chính xác và đáng tin cậy. Làm sạch dữ liệu đóng một vai trò quan trọng trong quá trình này và các giá trị trùng lặp là một trong những vấn đề phổ biến nhất mà các nhà phân tích dữ liệu gặp phải. Các giá trị trùng lặp có thể có khả năng xuyên tạc thông tin chi tiết. Do đó, điều quan trọng là phải có các phương pháp hiệu quả để xử lý các giá trị trùng lặp. Trong bài viết này, chúng ta sẽ tìm hiểu cách xác định và xử lý các giá trị trùng lặp, cũng như các phương pháp hay nhất để quản lý các giá trị trùng lặp.

Xác định các giá trị trùng lặp

Bước đầu tiên trong việc xử lý các giá trị trùng lặp là xác định chúng. Xác định các giá trị trùng lặp là một bước quan trọng trong quá trình làm sạch dữ liệu. Pandas cung cấp nhiều phương pháp để xác định các giá trị trùng lặp trong một khung dữ liệu. Trong phần này, chúng ta sẽ thảo luận về duplicated() chức năng và value_counts() chức năng xác định các giá trị trùng lặp.

Sử dụng nhân đôi ()

Sản phẩm duplicated() chức năng là một chức năng thư viện Pandas kiểm tra các hàng trùng lặp trong DataFrame. đầu ra của duplicated() hàm là một chuỗi boolean có cùng độ dài với DataFrame đầu vào, trong đó mỗi phần tử cho biết hàng tương ứng có trùng lặp hay không.

Hãy xem xét một ví dụ đơn giản về duplicated() chức năng:

import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) df_duplicates = df.duplicated()
print(df_duplicates)

Đầu ra:

0 False
1 False
2 False
3 False
4 False
5 True
dtype: bool

Trong ví dụ trên, chúng tôi đã tạo một DataFrame chứa tên của sinh viên và tổng điểm của họ. chúng tôi đã gọi duplicated() trên DataFrame, đã tạo ra một chuỗi boolean với False đại diện cho các giá trị duy nhất và True đại diện cho các giá trị trùng lặp.

Trong ví dụ này, lần xuất hiện đầu tiên của giá trị được coi là duy nhất. Tuy nhiên, nếu chúng tôi muốn giá trị cuối cùng được coi là duy nhất và chúng tôi không muốn xem xét tất cả các cột khi xác định các giá trị trùng lặp thì sao? Ở đây, chúng ta có thể sửa đổi duplicated() chức năng bằng cách thay đổi các giá trị tham số.

Tham số: Tập hợp con và Giữ

Sản phẩm duplicated() chức năng cung cấp các tùy chọn tùy chỉnh thông qua các tham số tùy chọn của nó. Nó có hai tham số, như được mô tả dưới đây:

  • subset: Tham số này cho phép chúng tôi chỉ định tập hợp con của các cột để xem xét trong quá trình phát hiện trùng lặp. Tập hợp con được đặt thành None theo mặc định, nghĩa là mỗi cột trong DataFrame đều được xem xét. Để chỉ định tên cột, chúng tôi có thể cung cấp cho tập hợp con danh sách tên cột.

    Dưới đây là một ví dụ về việc sử dụng tham số tập hợp con:

    
    df_duplicates = df.duplicated(subset=['StudentName'])
    

    Đầu ra:

    0 False
    1 False
    2 False
    3 False
    4 False
    5 True
    dtype: bool
    
  • keep: Tùy chọn này cho phép chúng tôi chọn phiên bản nào của hàng trùng lặp sẽ được đánh dấu là trùng lặp. Các giá trị có thể có để giữ là:

    • "first": Đây là giá trị mặc định cho keep lựa chọn. Nó xác định tất cả các bản sao ngoại trừ lần xuất hiện đầu tiên, coi giá trị đầu tiên là duy nhất.
    • "last": Tùy chọn này xác định lần xuất hiện cuối cùng dưới dạng một giá trị duy nhất. Tất cả các lần xuất hiện khác sẽ được coi là trùng lặp.
    • False: Tùy chọn này gắn nhãn cho mỗi phiên bản là một giá trị trùng lặp.

Đây là một ví dụ về việc sử dụng keep tham số:


df_duplicates = df.duplicated(keep='last')
print(df_duplicates)

Đầu ra:

0 True
1 False
2 False
3 False
4 False
5 False
dtype: bool
Trực quan hóa các giá trị trùng lặp

Sản phẩm value_counts() chức năng là cách tiếp cận thứ hai để xác định các bản sao. Các value_counts() hàm đếm số lần mỗi giá trị duy nhất xuất hiện trong một cột. Bằng cách áp dụng các value_counts() chức năng cho một cột cụ thể, tần số của mỗi giá trị có thể được hình dung.

Đây là một ví dụ về việc sử dụng value_counts() chức năng:

import matplotlib.pyplot as plt
import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) name_counts = df['StudentName'].value_counts()
print(name_counts)

Đầu ra:

Mark 2
Ali 1
Bob 1
John 1
Johny 1
Name: StudentName, dtype: int64

Bây giờ hãy trực quan hóa các giá trị trùng lặp bằng biểu đồ thanh. Chúng ta có thể hình dung hiệu quả tần suất của các giá trị trùng lặp bằng biểu đồ thanh.


name_counts.plot(kind='bar')
plt.xlabel('Student Name')
plt.ylabel('Frequency')
plt.title('Duplicate Name Frequencies')
plt.show()

các giá trị trùng lặp

Xử lý các giá trị trùng lặp

Sau khi xác định các giá trị trùng lặp, đã đến lúc giải quyết chúng. Trong phần này, chúng ta sẽ khám phá các chiến lược khác nhau để loại bỏ và cập nhật các giá trị trùng lặp bằng cách sử dụng pandas drop_duplicates()replace() chức năng. Ngoài ra, chúng ta sẽ thảo luận về việc tổng hợp dữ liệu với các giá trị trùng lặp bằng cách sử dụng groupby() chức năng.

Loại bỏ các giá trị trùng lặp

Cách tiếp cận phổ biến nhất để xử lý các bản sao là xóa chúng khỏi DataFrame. Để loại bỏ các bản ghi trùng lặp khỏi DataFrame, chúng tôi sẽ sử dụng drop_duplicates() chức năng. Theo mặc định, chức năng này giữ phiên bản đầu tiên của mỗi hàng trùng lặp và loại bỏ các lần xuất hiện tiếp theo. Nó xác định các giá trị trùng lặp dựa trên tất cả các giá trị cột; tuy nhiên, chúng ta có thể chỉ định cột được xem xét bằng cách sử dụng các tham số tập hợp con.

Cú pháp của drop_duplicates() với các giá trị mặc định trong tham số như sau:

dataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

Sản phẩm subsetkeep các tham số có cùng lời giải thích như trong duplicates(). Nếu chúng ta đặt tham số thứ ba inplace đến True, tất cả các sửa đổi sẽ được thực hiện trực tiếp trên DataFrame ban đầu, dẫn đến phương thức trả về None và DataFrame ban đầu đang được sửa đổi. Theo mặc định, inplace is False.

Đây là một ví dụ về drop_duplicates() chức năng:


df.drop_duplicates(keep='last', inplace=True)
print(df)

Đầu ra:

 StudentName Score
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Trong ví dụ trên, mục đầu tiên đã bị xóa vì nó trùng lặp.

Thay thế hoặc cập nhật các giá trị trùng lặp

Phương pháp thứ hai để xử lý các bản sao liên quan đến việc thay thế giá trị bằng Pandas replace() chức năng. Các replace() chức năng cho phép chúng tôi thay thế các giá trị hoặc mẫu cụ thể trong DataFrame bằng các giá trị mới. Theo mặc định, nó thay thế tất cả các phiên bản của giá trị. Tuy nhiên, bằng cách sử dụng tham số giới hạn, chúng tôi có thể hạn chế số lần thay thế.

Đây là một ví dụ về việc sử dụng replace() chức năng:


df['StudentName'].replace('Mark', 'Max', limit=1, inplace=True)
print(df)

Đầu ra:

 StudentName Score
0 Max 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

Ở đây, giới hạn được sử dụng để thay thế giá trị đầu tiên. Nếu chúng ta muốn thay thế lần xuất hiện cuối cùng thì sao? Trong trường hợp này, chúng tôi sẽ kết hợp các duplicated()replace() chức năng. sử dụng duplicated(), chúng tôi sẽ chỉ ra phiên bản cuối cùng của mỗi giá trị trùng lặp, lấy số hàng bằng cách sử dụng loc và sau đó thay thế nó bằng cách sử dụng replace() chức năng. Đây là một ví dụ về việc sử dụng duplicated()replace() chức năng với nhau.


last_occurrences = df.duplicated(subset='StudentName', keep='first') last_occurrences_rows = df[last_occurrences] df.loc[last_occurrences, 'StudentName'] = df.loc[last_occurrences, 'StudentName'].replace('Mark', 'Max') print(df)

Đầu ra:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Max 45

Chức năng tùy chỉnh cho các thay thế phức tạp

Trong một số trường hợp, việc xử lý các giá trị trùng lặp đòi hỏi nhiều thay thế phức tạp hơn là chỉ xóa hoặc cập nhật chúng. Các chức năng tùy chỉnh cho phép chúng tôi tạo các quy tắc thay thế cụ thể phù hợp với nhu cầu của chúng tôi. Bằng cách sử dụng gấu trúc apply() chức năng, chúng ta có thể áp dụng chức năng tùy chỉnh cho dữ liệu của mình.

Ví dụ: giả sử cột “StudentName” chứa các tên trùng lặp. Mục tiêu của chúng tôi là thay thế các giá trị trùng lặp bằng cách sử dụng hàm tùy chỉnh nối thêm một số vào cuối các giá trị trùng lặp, làm cho chúng trở nên độc nhất.


def add_number(name, counts): if name in counts: counts[name] += 1 return f'{name}_{counts[name]}' else: counts[name] = 0 return name name_counts = {} df['is_duplicate'] = df.duplicated('StudentName', keep=False)
df['StudentName'] = df.apply(lambda x: add_number(x['StudentName'], name_counts) if x['is_duplicate'] else x['StudentName'], axis=1)
df.drop('is_duplicate', axis=1, inplace=True)
print(df)

Đầu ra:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark_1 45

Dữ liệu tổng hợp với các giá trị trùng lặp

Dữ liệu chứa các giá trị trùng lặp có thể được tổng hợp để tóm tắt và hiểu rõ hơn về dữ liệu. gấu trúc groupby() chức năng cho phép bạn tổng hợp dữ liệu với các giá trị trùng lặp. Bằng cách sử dụng groupby() bạn có thể nhóm một hoặc nhiều cột và tính giá trị trung bình, trung bình hoặc tổng của một cột khác cho mỗi nhóm.

Đây là một ví dụ về việc sử dụng groupby() phương pháp:


grouped = df.groupby(['StudentName']) df_aggregated = grouped.sum()
print(df_aggregated)

Đầu ra:

 Score
StudentName Ali 65
Bob 76
John 44
Johny 39
Mark 90

Kỹ thuật tiên tiến

Để xử lý các tình huống phức tạp hơn và đảm bảo phân tích chính xác, có một số kỹ thuật nâng cao mà chúng ta có thể sử dụng. Phần này sẽ thảo luận về việc xử lý các bản sao mờ, bản sao trong dữ liệu chuỗi thời gian và các giá trị chỉ mục trùng lặp.

Bản sao mờ

Các bản sao mờ là các bản ghi không khớp chính xác nhưng tương tự nhau và chúng có thể xảy ra vì nhiều lý do, bao gồm lỗi nhập dữ liệu, lỗi chính tả và các biến thể về định dạng. chúng tôi sẽ sử dụng fuzzywuzzy Thư viện Python để xác định các bản sao bằng cách so khớp chuỗi tương tự.

Dưới đây là một ví dụ về xử lý các giá trị mờ:

import pandas as pd
from fuzzywuzzy import fuzz def find_fuzzy_duplicates(dataframe, column, threshold): duplicates = [] for i in range(len(dataframe)): for j in range(i+1, len(dataframe)): similarity = fuzz.ratio(dataframe[column][i], dataframe[column][j]) if similarity >= threshold: duplicates.append(dataframe.iloc[[i, j]]) if duplicates: duplicates_df = pd.concat(duplicates) return duplicates_df else: return pd.DataFrame() data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) threshold = 70 fuzzy_duplicates = find_fuzzy_duplicates(df, 'StudentName', threshold)
print("Fuzzy duplicates:")
print(fuzzy_duplicates.to_string(index=False))

Trong ví dụ này, chúng tôi tạo một chức năng tùy chỉnh find_fuzzy_duplicates lấy DataFrame, tên cột và ngưỡng tương tự làm đầu vào. Hàm lặp qua từng hàng trong DataFrame và so sánh nó với các hàng tiếp theo bằng cách sử dụng fuzz.ratio phương pháp từ fuzzywuzzy thư viện. Nếu điểm tương đồng lớn hơn hoặc bằng ngưỡng, các hàng trùng lặp sẽ được thêm vào danh sách. Cuối cùng, hàm trả về một DataFrame chứa các bản sao mờ.

Đầu ra:

Fuzzy duplicates:
StudentName Score Mark 45 Mark 45 John 44 Johny 39

Trong ví dụ trên, các bản sao mờ được xác định trong cột “Tên sinh viên”. Hàm 'find_fuzzy_duplicates' so sánh từng cặp chuỗi bằng cách sử dụng fuzzywuzzy thư viện fuzz.ratio tính toán điểm tương tự dựa trên khoảng cách Levenshtein. Chúng tôi đã đặt ngưỡng ở mức 70, nghĩa là bất kỳ tên nào có tỷ lệ đối sánh lớn hơn 70 sẽ được coi là giá trị mờ. Sau khi xác định các giá trị mờ, chúng ta có thể quản lý chúng bằng phương pháp được nêu trong phần có tiêu đề “Xử lý các giá trị trùng lặp”.

Xử lý dữ liệu chuỗi thời gian trùng lặp

Sự trùng lặp có thể xảy ra khi nhiều quan sát được ghi lại ở cùng một dấu thời gian. Các giá trị này có thể dẫn đến kết quả sai lệch nếu không được xử lý đúng cách. Dưới đây là một số cách để xử lý các giá trị trùng lặp trong dữ liệu chuỗi thời gian.

  • Loại bỏ các bản sao chính xác: Trong phương pháp này, chúng tôi loại bỏ các hàng giống hệt nhau bằng cách sử dụng drop_duplicates chức năng trong Pandas.
  • Sao chép dấu thời gian với các giá trị khác nhau: Nếu chúng ta có cùng dấu thời gian nhưng khác giá trị, chúng ta có thể tổng hợp dữ liệu và hiểu rõ hơn bằng cách sử dụng groupby()hoặc chúng ta có thể chọn giá trị gần đây nhất và xóa các giá trị khác bằng cách sử dụng drop_duplicates() với keep tham số được đặt thành 'cuối cùng'.

Xử lý các giá trị chỉ mục trùng lặp

Trước khi giải quyết các giá trị chỉ mục trùng lặp, trước tiên hãy xác định chỉ mục là gì trong Pandas. Chỉ mục là một mã định danh duy nhất được gán cho mỗi hàng của DataFrame. Pandas mặc định gán một chỉ mục số bắt đầu từ XNUMX. Tuy nhiên, một chỉ mục có thể được gán cho bất kỳ cột hoặc tổ hợp cột nào. Để xác định các mục trùng lặp trong cột Chỉ mục, chúng ta có thể sử dụng duplicated()drop_duplicates() chức năng, tương ứng. Trong phần này, chúng ta sẽ khám phá cách xử lý các bản sao trong cột Chỉ mục bằng cách sử dụng reset_index().

Như tên của nó, reset_index() chức năng trong Pandas được sử dụng để đặt lại chỉ mục của DataFrame. Khi áp dụng các reset_index() chức năng, chỉ mục hiện tại sẽ tự động bị loại bỏ, có nghĩa là các giá trị chỉ mục ban đầu bị mất. Bằng cách chỉ định các drop tham số như False trong reset_index() chức năng, chúng tôi có thể giữ lại giá trị chỉ mục ban đầu trong khi đặt lại chỉ mục.

Đây là một ví dụ về việc sử dụng reset_index():

import pandas as pd data = { 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data, index=['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark']) df.reset_index(inplace=True)
print(df)

Đầu ra:

 index Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

Thực tiễn tốt nhất

  • Hiểu bản chất của dữ liệu trùng lặp: Trước khi thực hiện bất kỳ hành động nào, điều quan trọng là phải hiểu lý do tại sao các giá trị trùng lặp tồn tại và những gì chúng đại diện. Xác định nguyên nhân gốc rễ và sau đó xác định các bước thích hợp để xử lý chúng.

  • Chọn một phương pháp thích hợp để xử lý các bản sao: Như đã thảo luận trong các phần trước, có nhiều cách để xử lý các bản sao. Phương pháp bạn chọn tùy thuộc vào bản chất của dữ liệu và phân tích mà bạn muốn thực hiện.

  • Tài liệu về cách tiếp cận: Điều quan trọng là phải ghi lại quá trình phát hiện các giá trị trùng lặp và giải quyết chúng, cho phép những người khác hiểu được quá trình suy nghĩ.

  • Chú ý khi tập luyện: Bất cứ khi nào chúng tôi xóa hoặc sửa đổi dữ liệu, chúng tôi phải đảm bảo rằng việc loại bỏ các dữ liệu trùng lặp không gây ra lỗi hoặc sai lệch trong phân tích. Tiến hành kiểm tra độ tỉnh táo và xác nhận kết quả của từng hành động.

  • Giữ nguyên dữ liệu gốc: Trước khi thực hiện bất kỳ thao tác nào trên dữ liệu, hãy tạo một bản sao lưu của dữ liệu gốc.

  • Ngăn chặn các bản sao trong tương lai: Thực hiện các biện pháp để ngăn trùng lặp xảy ra trong tương lai. Điều này có thể bao gồm xác thực dữ liệu trong quá trình nhập dữ liệu, quy trình làm sạch dữ liệu hoặc ràng buộc cơ sở dữ liệu để thực thi tính duy nhất.

Kết luận:

Trong phân tích dữ liệu, giải quyết các giá trị trùng lặp là một bước quan trọng. Các giá trị trùng lặp có thể dẫn đến kết quả không chính xác. Bằng cách xác định và quản lý các giá trị trùng lặp một cách hiệu quả, các nhà phân tích dữ liệu có thể lấy được thông tin chính xác và quan trọng. Việc triển khai các kỹ thuật được đề cập và tuân theo các phương pháp hay nhất sẽ cho phép các nhà phân tích duy trì tính toàn vẹn của dữ liệu của họ và trích xuất những hiểu biết có giá trị từ dữ liệu đó.

Dấu thời gian:

Thêm từ xếp chồng lên nhau