טיפול בערכים כפולים ב-Pandas DataFrame

טיפול בערכים כפולים ב-Pandas DataFrame

מבוא

כמנתח נתונים, באחריותנו להבטיח את שלמות הנתונים כדי לקבל תובנות מדויקות ומהימנות. ניקוי נתונים ממלא תפקיד חיוני בתהליך זה, וערכים כפולים הם בין הבעיות הנפוצות ביותר שנתקלים בהן מנתחי נתונים. ערכים כפולים עלולים לייצג תובנות בצורה שגויה. לכן, חיוני שיהיו שיטות יעילות להתמודדות עם ערכים כפולים. במאמר זה נלמד כיצד לזהות ערכים כפולים ולטפל בהם, וכן שיטות עבודה מומלצות לניהול כפילויות.

זיהוי ערכים כפולים

השלב הראשון בטיפול בערכים כפולים הוא לזהות אותם. זיהוי ערכים כפולים הוא שלב חשוב בניקוי הנתונים. Pandas מציעה מספר שיטות לזיהוי ערכים כפולים בתוך מסגרת נתונים. בחלק זה, נדון ב duplicated() ופונקציה value_counts() פונקציה לזיהוי ערכים כפולים.

אוסין מוּעֲתָק()

השמיים duplicated() function היא פונקציית ספריית Pandas הבודקת שורות כפולות ב-DataFrame. הפלט של ה duplicated() function היא סדרה בוליאנית באורך זהה לזה של הקלט DataFrame, כאשר כל אלמנט מציין אם השורה המתאימה היא כפיל או לא.

בואו נשקול דוגמה פשוטה של duplicated() פוּנקצִיָה:

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)

פלט:

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

בדוגמה למעלה, יצרנו DataFrame המכילה את שמות התלמידים והציונים הכוללים שלהם. הזמנו duplicated() על ה-DataFrame, שיצר סדרה בוליאנית עם False מייצג ערכים ייחודיים ו True המייצגים ערכים כפולים.

בדוגמה זו, המופע הראשון של הערך נחשב לייחודי. עם זאת, מה אם אנחנו רוצים שהערך האחרון ייחשב לייחודי, ואנחנו לא רוצים לקחת בחשבון את כל העמודות בעת זיהוי ערכים כפולים? כאן, אנחנו יכולים לשנות את duplicated() לתפקד על ידי שינוי ערכי הפרמטרים.

פרמטרים: תת-קבוצה ו-Keep

השמיים duplicated() הפונקציה מציעה אפשרויות התאמה אישית באמצעות הפרמטרים האופציונליים שלה. יש לו שני פרמטרים, כמתואר להלן:

  • subset: פרמטר זה מאפשר לנו לציין את קבוצת המשנה של העמודות שיש לקחת בחשבון במהלך זיהוי כפילויות. קבוצת המשנה מוגדרת ל None כברירת מחדל, כלומר כל עמודה ב-DataFrame נחשבת. כדי לציין שמות עמודות, אנו יכולים לספק לקבוצת המשנה רשימה של שמות עמודות.

    הנה דוגמה לשימוש בפרמטר המשנה:

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

    פלט:

    0 False
    1 False
    2 False
    3 False
    4 False
    5 True
    dtype: bool
    
  • keep: אפשרות זו מאפשרת לנו לבחור איזה מופע של השורה הכפולה יש לסמן ככפול. הערכים האפשריים עבור keep הם:

    • "first": זהו ערך ברירת המחדל עבור keep אוֹפְּצִיָה. הוא מזהה את כל הכפילויות מלבד ההתרחשות הראשונה, בהתחשב בערך הראשון כייחודי.
    • "last": אפשרות זו מזהה את המופע האחרון כערך ייחודי. כל שאר ההתרחשויות ייחשבו כפילויות.
    • False: אפשרות זו מסמנת כל מופע כערך כפול.

להלן דוגמא לשימוש ב- keep פָּרָמֶטֶר:


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

פלט:

0 True
1 False
2 False
3 False
4 False
5 False
dtype: bool
דמיין ערכים כפולים

השמיים value_counts() פונקציה היא הגישה השנייה לזיהוי כפילויות. ה value_counts() הפונקציה סופרת את מספר הפעמים שכל ערך ייחודי מופיע בעמודה. על ידי יישום ה value_counts() פונקציה לעמודה מסוימת, ניתן להמחיש את התדירות של כל ערך.

להלן דוגמא לשימוש ב- value_counts() פוּנקצִיָה:

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)

פלט:

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

כעת נדמיין ערכים כפולים באמצעות גרף עמודות. אנו יכולים לדמיין ביעילות את התדירות של ערכים כפולים באמצעות תרשים עמודות.


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

ערכים כפולים

טיפול בערכים כפולים

לאחר זיהוי ערכים כפולים, הגיע הזמן לטפל בהם. בחלק זה, נחקור אסטרטגיות שונות להסרה ועדכון של ערכים כפולים באמצעות הפנדות drop_duplicates() ו replace() פונקציות. בנוסף, נדון בצבירה של נתונים עם ערכים כפולים באמצעות ה- groupby() פונקציה.

הסרת ערכים כפולים

הגישה הנפוצה ביותר לטיפול בכפילויות היא הסרתן מה-DataFrame. כדי להסיר רשומות כפולות מה-DataFrame, נשתמש ב- drop_duplicates() פוּנקצִיָה. כברירת מחדל, פונקציה זו שומרת את המופע הראשון של כל שורה כפולה ומסירה את המופעים הבאים. הוא מזהה ערכים כפולים בהתבסס על כל ערכי העמודות; עם זאת, אנו יכולים לציין את העמודה שתיחשב באמצעות פרמטרי משנה.

תחביר של drop_duplicates() עם ערכי ברירת מחדל בפרמטרים הוא כדלקמן:

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

השמיים subset ו keep לפרמטרים יש את אותו הסבר כמו ב duplicates(). אם נגדיר את הפרמטר השלישי inplace ל True, כל השינויים יבוצעו ישירות ב-DataFrame המקורי, וכתוצאה מכך השיטה תחזור None וה-DataFrame המקורי משתנה. כברירת מחדל, inplace is False.

הנה דוגמה ל drop_duplicates() פוּנקצִיָה:


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

פלט:

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

עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!

בדוגמה לעיל, הערך הראשון נמחק מכיוון שהוא היה כפיל.

החלף או עדכן ערכים כפולים

השיטה השנייה לטיפול בכפילויות כוללת החלפת הערך באמצעות הפנדות replace() פונקציה. ה replace() הפונקציה מאפשרת לנו להחליף ערכים או דפוסים ספציפיים ב-DataFrame בערכים חדשים. כברירת מחדל, הוא מחליף את כל המופעים של הערך. עם זאת, על ידי שימוש בפרמטר הגבול, נוכל להגביל את מספר ההחלפות.

הנה דוגמה לשימוש ב- replace() פוּנקצִיָה:


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

פלט:

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

כאן, הגבול שימש כדי להחליף את הערך הראשון. מה אם נרצה להחליף את ההתרחשות האחרונה? במקרה זה, נשלב את duplicated() ו replace() פונקציות. באמצעות duplicated(), נציין את המופע האחרון של כל ערך משוכפל, נקבל את מספר השורה באמצעות ה- loc הפונקציה ולאחר מכן החליפו אותה באמצעות ה- replace() פוּנקצִיָה. הנה דוגמה לשימוש duplicated() ו replace() מתפקדים יחד.


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)

פלט:

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

פונקציות מותאמות אישית להחלפות מורכבות

במקרים מסוימים, טיפול בערכים כפולים דורש החלפות מורכבות יותר מאשר פשוט הסרה או עדכון שלהם. פונקציות מותאמות אישית מאפשרות לנו ליצור כללי החלפה ספציפיים המותאמים לצרכים שלנו. על ידי שימוש בפנדות apply() פונקציה, נוכל להחיל את הפונקציה המותאמת אישית על הנתונים שלנו.

לדוגמה, נניח שהעמודה "שם תלמיד" מכילה שמות כפולים. המטרה שלנו היא להחליף כפילויות באמצעות פונקציה מותאמת אישית שמצרפת מספר בסוף ערכים כפולים, מה שהופך אותם לייחודיים.


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)

פלט:

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

צבר נתונים עם ערכים כפולים

ניתן לצבור נתונים המכילים ערכים כפולים כדי לסכם ולהשיג תובנות מהנתונים. הפנדות groupby() הפונקציה מאפשרת לך לצבור נתונים עם ערכים כפולים. על ידי שימוש ב groupby() פונקציה, אתה יכול לקבץ עמודה אחת או יותר ולחשב את הממוצע, החציון או הסכום של עמודה אחרת עבור כל קבוצה.

הנה דוגמה לשימוש ב- groupby() שיטה:


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

פלט:

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

טכניקות מתקדמות

כדי לטפל בתרחישים מורכבים יותר ולהבטיח ניתוח מדויק, יש כמה טכניקות מתקדמות שבהן נוכל להשתמש. חלק זה ידון בהתמודדות עם כפילויות מעורפלות, כפילות בנתוני סדרות זמן וערכי אינדקס כפולים.

כפילויות מטושטשות

כפילויות מטושטשות הן רשומות שאינן התאמות מדויקות אך דומות, והן עשויות להתרחש מסיבות שונות, כולל טעויות בהזנת נתונים, שגיאות כתיב וגרסאות בעיצוב. נשתמש ב- fuzzywuzzy ספריית Python לזיהוי כפילויות באמצעות התאמת דמיון מחרוזת.

הנה דוגמה לטיפול בערכים מטושטשים:

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))

בדוגמה זו, אנו יוצרים פונקציה מותאמת אישית find_fuzzy_duplicates שלוקח DataFrame, שם עמודה וסף דמיון כקלט. הפונקציה חוזרת דרך כל שורה ב-DataFrame ומשווה אותה לשורות עוקבות באמצעות fuzz.ratio שיטה מתוך fuzzywuzzy סִפְרִיָה. אם ציון הדמיון גדול או שווה לסף, השורות הכפולות מתווספות לרשימה. לבסוף, הפונקציה מחזירה DataFrame המכילה את הכפילויות המטושטשות.

פלט:

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

בדוגמה שלמעלה, כפילויות מטושטשות מזוהות בעמודה "שם תלמיד". הפונקציה 'find_fuzzy_duplicates' משווה כל זוג מחרוזות באמצעות ה- fuzzywuzzy של הספרייה fuzz.ratio פונקציה, המחשבת ציון דמיון על סמך מרחק לוונשטיין. קבענו את הסף ל-70, כלומר כל שם עם יחס התאמה גדול מ-70 ייחשב לערך מעורפל. לאחר זיהוי ערכים מטושטשים, נוכל לנהל אותם באמצעות השיטה המתוארת בסעיף שכותרתו "טיפול בכפילויות".

טיפול בשכפולים של נתונים מסדרות זמן

כפילויות יכולות להתרחש כאשר מספר תצפיות נרשמות באותה חותמת זמן. ערכים אלה עלולים להוביל לתוצאות מוטות אם לא יטופלו כראוי. להלן מספר דרכים לטפל בערכים כפולים בנתוני סדרות זמן.

  • ביטול כפילויות מדויקות: בשיטה זו, אנו מסירים שורות זהות באמצעות ה- drop_duplicates לתפקד בפנדות.
  • שכפול חותמות זמן עם ערכים שונים: אם יש לנו חותמת זמן זהה אך ערכים שונים, נוכל לצבור את הנתונים ולקבל יותר תובנות באמצעות groupby(), או שנוכל לבחור את הערך העדכני ביותר ולהסיר את האחרים באמצעות drop_duplicates() עם keep הפרמטר מוגדר ל'אחרון'.

טיפול בערכי אינדקס כפולים

לפני שנתייחס לערכי אינדקס כפולים, בואו נגדיר תחילה מהו אינדקס ב-Pandas. אינדקס הוא מזהה ייחודי המוקצה לכל שורה של ה-DataFrame. Pandas מקצה אינדקס מספרי שמתחיל מאפס כברירת מחדל. עם זאת, ניתן להקצות אינדקס לכל שילוב עמודה או עמודה. כדי לזהות כפילויות בעמודת האינדקס, נוכל להשתמש ב- duplicated() ו drop_duplicates() פונקציות, בהתאמה. בחלק זה, נחקור כיצד לטפל בכפילויות בעמודת אינדקס באמצעות reset_index().

כשמו כן הוא reset_index() הפונקציה ב-Pandas משמשת לאיפוס אינדקס של DataFrame. בעת החלת ה reset_index() הפונקציה, האינדקס הנוכחי נמחק אוטומטית, מה שאומר שערכי האינדקס הראשוניים אובדים. על ידי ציון ה drop פרמטר כ False ב reset_index() פונקציה, נוכל לשמור על ערך האינדקס המקורי תוך איפוס האינדקס.

הנה דוגמה לשימוש 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)

פלט:

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

שיטות עבודה מומלצות

  • הבן את אופי הנתונים הכפולים: לפני נקיטת פעולה כלשהי, חשוב להבין מדוע קיימים ערכים כפולים ומה הם מייצגים. זהה את סיבת השורש ולאחר מכן קבע את הצעדים המתאימים לטיפול בהם.

  • בחר שיטה מתאימה לטיפול בכפילויות: כפי שנדון בסעיפים הקודמים, ישנן מספר דרכים לטפל בכפילויות. השיטה שתבחר תלויה באופי הנתונים ובניתוח שאתה שואף לבצע.

  • תיעד את הגישה: חיוני לתעד את התהליך לאיתור ערכים כפולים והתייחסות אליהם, לאפשר לאחרים להבין את תהליך החשיבה.

  • אזהרה לגבי התעמלות: בכל פעם שאנו מסירים או משנים נתונים, עלינו לוודא שביטול כפילויות לא יכניס שגיאות או הטיה בניתוח. ערכו בדיקות שפיות ותקפו את התוצאות של כל פעולה.

  • שמור את הנתונים המקוריים: לפני ביצוע פעולה כלשהי בנתונים, צור עותק גיבוי של הנתונים המקוריים.

  • מניעת כפילויות עתידיות: יישם אמצעים למניעת התרחשות כפילויות בעתיד. זה יכול לכלול אימות נתונים במהלך הזנת נתונים, שגרות ניקוי נתונים או אילוצי מסד נתונים כדי לאכוף ייחודיות.

מחשבות סופיות

בניתוח נתונים, טיפול בערכים כפולים הוא צעד מכריע. ערכים כפולים עלולים להוביל לתוצאות לא מדויקות. על ידי זיהוי וניהול ערכים כפולים ביעילות, מנתחי נתונים יכולים להפיק מידע מדויק ומשמעותי. יישום הטכניקות שהוזכרו וביצוע שיטות עבודה מומלצות יאפשרו לאנליסטים לשמר את שלמות הנתונים שלהם ולהפיק מהם תובנות יקרות ערך.

בול זמן:

עוד מ Stackabuse