# Εργασία με Δεδομένα: Προετοιμασία Δεδομένων |![ Σημειώσεις από [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/08-DataPreparation.png)| |:---:| |Προετοιμασία Δεδομένων - _Σημειώσεις από [@nitya](https://twitter.com/nitya)_ | ## [Προ-Διαλέξη Κουίζ](https://ff-quizzes.netlify.app/en/ds/quiz/14) Ανάλογα με την πηγή της, η ακατέργαστη πληροφορία μπορεί να περιέχει κάποια ασυνέπειες που θα προκαλέσουν προκλήσεις στην ανάλυση και τη μοντελοποίηση. Με άλλα λόγια, αυτά τα δεδομένα μπορούν να κατηγοριοποιηθούν ως «βρώμικα» και θα πρέπει να καθαριστούν. Το μάθημα αυτό εστιάζει σε τεχνικές καθαρισμού και μετασχηματισμού των δεδομένων για να αντιμετωπιστούν προκλήσεις όπως η έλλειψη, η ανακρίβεια ή η ατελή πληρότητα των δεδομένων. Τα θέματα που καλύπτονται σε αυτό το μάθημα θα αξιοποιήσουν την Python και τη βιβλιοθήκη Pandas και θα παρουσιαστούν [στο τετράδιο](notebook.ipynb) μέσα σε αυτόν τον φάκελο. ## Η σημασία του καθαρισμού δεδομένων - **Ευκολία χρήσης και επαναχρησιμοποίησης**: Όταν τα δεδομένα είναι σωστά οργανωμένα και κανονικοποιημένα, είναι πιο εύκολη η αναζήτηση, η χρήση και η κοινή χρήση τους με άλλους. - **Συνέπεια**: Η επιστήμη των δεδομένων συχνά απαιτεί εργασία με περισσότερα από ένα σύνολα δεδομένων, όπου τα σύνολα από διαφορετικές πηγές πρέπει να συνενωθούν. Η διασφάλιση ότι κάθε ξεχωριστό σύνολο δεδομένων έχει κοινή τυποποίηση εξασφαλίζει ότι τα δεδομένα παραμένουν χρήσιμα όταν συγχωνευθούν όλα σε ένα σύνολο δεδομένων. - **Ακρίβεια μοντέλου**: Τα καθαρισμένα δεδομένα βελτιώνουν την ακρίβεια των μοντέλων που βασίζονται σε αυτά. ## Συνήθεις στόχοι και στρατηγικές καθαρισμού - **Εξερεύνηση ενός συνόλου δεδομένων**: Η εξερεύνηση δεδομένων, που καλύπτεται σε [μεταγενέστερο μάθημα](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/4-Data-Science-Lifecycle/15-analyzing), μπορεί να σας βοηθήσει να ανακαλύψετε δεδομένα που χρειάζονται καθαρισμό. Η οπτική παρατήρηση των τιμών μέσα σε ένα σύνολο δεδομένων μπορεί να θέσει τις προσδοκίες για το πώς θα μοιάζει το υπόλοιπο, ή να δώσει μια ιδέα για τα προβλήματα που μπορούν να επιλυθούν. Η εξερεύνηση μπορεί να περιλαμβάνει βασικό ερώτημα, οπτικοποιήσεις και δειγματοληψία. - **Μορφοποίηση**: Ανάλογα με την πηγή, τα δεδομένα μπορεί να έχουν ασυνέπειες στον τρόπο που παρουσιάζονται. Αυτό μπορεί να προκαλέσει προβλήματα στην αναζήτηση και την αναπαράσταση της τιμής, όταν η τιμή εμφανίζεται μέσα στο σύνολο δεδομένων αλλά δεν αναπαρίσταται σωστά σε οπτικοποιήσεις ή αποτελέσματα ερωτημάτων. Κοινά προβλήματα μορφοποίησης αφορούν την επίλυση των κενών, των ημερομηνιών και των τύπων δεδομένων. Η επίλυση θεμάτων μορφοποίησης συνήθως ανήκει στα άτομα που χρησιμοποιούν τα δεδομένα. Για παράδειγμα, πρότυπα για το πώς παρουσιάζονται οι ημερομηνίες και οι αριθμοί μπορεί να διαφέρουν ανά χώρα. - **Διπλότυπα**: Τα δεδομένα που έχουν περισσότερες από μία εμφανίσεις μπορεί να παράγουν ανακριβή αποτελέσματα και συνήθως θα πρέπει να αφαιρούνται. Αυτό μπορεί να είναι συχνό όταν συνενώνονται δύο ή περισσότερα σύνολα δεδομένων. Ωστόσο, υπάρχουν περιπτώσεις όπου η διπλοεγγραφή σε συνενωμένα σύνολα δεδομένων περιέχει στοιχεία που μπορούν να παρέχουν πρόσθετες πληροφορίες και μπορεί να χρειαστεί να διατηρηθούν. - **Ελλείποντα δεδομένα**: Τα ελλείποντα δεδομένα μπορεί να προκαλέσουν ανακρίβειες καθώς και αδύναμα ή μεροληπτικά αποτελέσματα. Μερικές φορές αυτά μπορούν να επιλυθούν με επαναφόρτωση των δεδομένων, συμπλήρωση των ελλειπόντων τιμών με υπολογισμούς και κώδικα όπως η Python, ή απλά με αφαίρεση της τιμής και των αντίστοιχων δεδομένων. Υπάρχουν πολλοί λόγοι για τους οποίους μπορεί να λείπουν δεδομένα και οι ενέργειες που λαμβάνονται για να επιλυθούν αυτές οι ελλείπουσες τιμές μπορεί να εξαρτώνται από το πώς και γιατί λείπουν αρχικά. ## Εξερεύνηση των πληροφοριών DataFrame > **Στόχος μάθησης:** Στο τέλος αυτής της υποενότητας, θα πρέπει να είστε άνετοι στο να βρίσκετε γενικές πληροφορίες για τα δεδομένα που αποθηκεύονται σε pandas DataFrames. Μόλις φορτώσετε τα δεδομένα σας στην pandas, θα είναι μάλλον πολύ πιθανό να βρίσκονται μέσα σε ένα DataFrame (ανατρέξτε στο προηγούμενο [μάθημα](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/2-Working-With-Data/07-python#dataframe) για λεπτομερή επισκόπηση). Παρ' όλα αυτά, αν το σύνολο δεδομένων στο DataFrame σας έχει 60.000 γραμμές και 400 στήλες, πώς μπορείτε να ξεκινήσετε να αντιλαμβάνεστε με τι εργάζεστε; Ευτυχώς, η [pandas](https://pandas.pydata.org/) παρέχει κάποια βολικά εργαλεία για να ρίξετε γρήγορα μια ματιά σε συνολικές πληροφορίες για ένα DataFrame, επιπλέον από τις πρώτες και τις τελευταίες γραμμές. Για να εξερευνήσουμε αυτή τη λειτουργικότητα, θα εισάγουμε τη βιβλιοθήκη scikit-learn της Python και θα χρησιμοποιήσουμε ένα εμβληματικό σύνολο δεδομένων: το **σύνολο δεδομένων Iris**. ```python import pandas as pd from sklearn.datasets import load_iris iris = load_iris() iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names']) ``` | |μήκος πετάλου (cm)|πλάτος πετάλου (cm)|μήκος πέταλου (cm)|πλάτος πέταλου (cm)| |----------------------------------------|-----------------|----------------|-----------------|----------------| |0 |5.1 |3.5 |1.4 |0.2 | |1 |4.9 |3.0 |1.4 |0.2 | |2 |4.7 |3.2 |1.3 |0.2 | |3 |4.6 |3.1 |1.5 |0.2 | |4 |5.0 |3.6 |1.4 |0.2 | - **DataFrame.info**: Για αρχή, η μέθοδος `info()` χρησιμοποιείται για εκτύπωση μιας περίληψης των δεδομένων που περιέχει ένα `DataFrame`. Ας ρίξουμε μια ματιά σε αυτό το σύνολο δεδομένων για να δούμε τι έχουμε: ```python iris_df.info() ``` ``` RangeIndex: 150 entries, 0 to 149 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sepal length (cm) 150 non-null float64 1 sepal width (cm) 150 non-null float64 2 petal length (cm) 150 non-null float64 3 petal width (cm) 150 non-null float64 dtypes: float64(4) memory usage: 4.8 KB ``` Από αυτό, γνωρίζουμε ότι το σύνολο δεδομένων *Iris* έχει 150 εγγραφές σε τέσσερις στήλες χωρίς κενές εγγραφές. Όλα τα δεδομένα είναι αποθηκευμένα ως αριθμοί κινητής υποδιαστολής 64 bit. - **DataFrame.head()**: Επόμενο, για να ελέγξουμε το πραγματικό περιεχόμενο του `DataFrame`, χρησιμοποιούμε τη μέθοδο `head()`. Ας δούμε πώς μοιάζουν οι πρώτες λίγες γραμμές του `iris_df`: ```python iris_df.head() ``` ``` sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 ``` - **DataFrame.tail()**: Αντίθετα, για να ελέγξουμε τις τελευταίες λίγες γραμμές του `DataFrame`, χρησιμοποιούμε τη μέθοδο `tail()`: ```python iris_df.tail() ``` ``` sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 145 6.7 3.0 5.2 2.3 146 6.3 2.5 5.0 1.9 147 6.5 3.0 5.2 2.0 148 6.2 3.4 5.4 2.3 149 5.9 3.0 5.1 1.8 ``` > **Συμπέρασμα:** Ακόμα και μόνο με μια ματιά στα μεταδεδομένα για τις πληροφορίες σε ένα DataFrame ή στις πρώτες και τελευταίες λίγες τιμές, μπορείτε να πάρετε μια άμεση ιδέα για το μέγεθος, το σχήμα και το περιεχόμενο των δεδομένων με τα οποία εργάζεστε. ## Διαχείριση ελλειπόντων δεδομένων > **Στόχος μάθησης:** Στο τέλος αυτής της υποενότητας, θα πρέπει να ξέρετε πώς να αντικαθιστάτε ή να αφαιρείτε κενές τιμές από DataFrames. Τις περισσότερες φορές, τα σύνολα δεδομένων που θέλετε να χρησιμοποιήσετε (ή πρέπει να χρησιμοποιήσετε) έχουν ελλείπουσες τιμές. Ο τρόπος διαχείρισης των ελλειπόντων δεδομένων συνεπάγεται λεπτές ανταλλαγές που μπορεί να επηρεάσουν την τελική σας ανάλυση και τα αποτελέσματα στον πραγματικό κόσμο. Η pandas διαχειρίζεται τις ελλείπουσες τιμές με δύο τρόπους. Ο πρώτος που έχετε δει πριν σε προηγούμενες ενότητες είναι το `NaN`, ή Not a Number. Αυτή είναι στην πραγματικότητα μια ειδική τιμή που αποτελεί μέρος της προδιαγραφής κινητής υποδιαστολής IEEE και χρησιμοποιείται μόνο για να υποδηλώσει ελλείπουσες τιμές κινητής υποδιαστολής. Για ελλείπουσες τιμές εκτός κινητής υποδιαστολής, η pandas χρησιμοποιεί το αντικείμενο Python `None`. Αν και μπορεί να φαίνεται μπερδεμένο ότι θα συναντήσετε δύο διαφορετικούς τύπους τιμών που ουσιαστικά λένε το ίδιο πράγμα, υπάρχουν βάσιμοι προγραμματιστικοί λόγοι για αυτήν την επιλογή σχεδιασμού και, στην πράξη, αυτή η προσέγγιση επιτρέπει στην pandas να παρέχει έναν καλό συμβιβασμό για την πλειονότητα των περιπτώσεων. Παρόλα αυτά, τόσο το `None` όσο και το `NaN` έχουν περιορισμούς που πρέπει να λαμβάνετε υπόψη σχετικά με το πώς μπορούν να χρησιμοποιηθούν. Μάθετε περισσότερα για τα `NaN` και `None` από το [τετράδιο](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/4-Data-Science-Lifecycle/15-analyzing/notebook.ipynb)! - **Ανίχνευση κενών τιμών**: Στην `pandas`, οι μέθοδοι `isnull()` και `notnull()` είναι οι βασικές μέθοδοι για την ανίχνευση κενών τιμών. Και οι δύο επιστρέφουν μάσκες Boolean πάνω στα δεδομένα σας. Θα χρησιμοποιήσουμε το `numpy` για τις τιμές `NaN`: ```python import numpy as np example1 = pd.Series([0, np.nan, '', None]) example1.isnull() ``` ``` 0 False 1 True 2 False 3 True dtype: bool ``` Κοιτάξτε προσεκτικά την έξοδο. Σας εκπλήσσει κάτι; Ενώ το `0` είναι ένα αριθμητικό μηδέν, είναι ωστόσο ένας απολύτως έγκυρος ακέραιος και η pandas τον χειρίζεται ως τέτοιο. Το `''` είναι λίγο πιο λεπτό. Παρότι το χρησιμοποιήσαμε στην Ενότητα 1 για να αναπαραστήσουμε μια κενή συμβολοσειρά, παραμένει αντικείμενο συμβολοσειράς και όχι αναπαράσταση μηδενικής τιμής όσο αφορά την pandas. Τώρα, ας το αντιστρέψουμε και να χρησιμοποιήσουμε αυτές τις μεθόδους με τρόπο πιο οικείο στη χρήση στην πράξη. Μπορείτε να χρησιμοποιήσετε μάσκες Boolean απευθείας ως δείκτες ενός ``Series`` ή ``DataFrame``, κάτι που μπορεί να είναι χρήσιμο όταν θέλετε να δουλέψετε με απομονωμένες ελλείπουσες (ή παρούσες) τιμές. > **Συμπέρασμα**: Και οι μέθοδοι `isnull()` και `notnull()` παράγουν παρόμοια αποτελέσματα όταν τις χρησιμοποιείτε σε `DataFrame`: εμφανίζουν τα αποτελέσματα και τον δείκτη αυτών των αποτελεσμάτων, κάτι που θα σας βοηθήσει σημαντικά καθώς παλεύετε με τα δεδομένα σας. - **Απόρριψη κενών τιμών**: Πέρα από τον εντοπισμό ελλειπόντων τιμών, η pandas παρέχει έναν βολικό τρόπο να αφαιρείτε κενές τιμές από `Series` και `DataFrame`. (Ιδιαίτερα σε μεγάλα σύνολα δεδομένων, συνήθως είναι προτιμότερο να αφαιρείτε τις απουσίες [NA] αντί να τις χειρίζεστε με άλλους τρόπους.) Για να το δείτε σε δράση, ας επιστρέψουμε στον `example1`: ```python example1 = example1.dropna() example1 ``` ``` 0 0 2 dtype: object ``` Σημειώστε ότι αυτό θα πρέπει να μοιάζει με την έξοδό σας από το `example3[example3.notnull()]`. Η διαφορά εδώ είναι ότι, αντί να κάνουμε απλή δεικτοδότηση στις τιμές μέσω της μάσκας, το `dropna` έχει αφαιρέσει αυτές τις ελλείπουσες τιμές από το `Series` `example1`. Επειδή τα `DataFrame` έχουν δύο διαστάσεις, προσφέρουν περισσότερες επιλογές για την αφαίρεση δεδομένων. ```python example2 = pd.DataFrame([[1, np.nan, 7], [2, 5, 8], [np.nan, 6, 9]]) example2 ``` | | 0 | 1 | 2 | |------|---|---|---| |0 |1.0|NaN|7 | |1 |2.0|5.0|8 | |2 |NaN|6.0|9 | (Παρατηρήσατε ότι η pandas έχει μετατρέψει δύο από τις στήλες σε floats για να φιλοξενήσουν τα `NaN`;) Δεν μπορείτε να αφαιρέσετε μία μόνο τιμή από ένα `DataFrame`, οπότε πρέπει να αφαιρέσετε ολόκληρες γραμμές ή στήλες. Ανάλογα με το τι κάνετε, μπορεί να θέλετε το ένα ή το άλλο, και έτσι η pandas σας δίνει επιλογές και για τα δύο. Επειδή στην επιστήμη δεδομένων, οι στήλες συνήθως αναπαριστούν μεταβλητές και οι γραμμές αντιπροσωπεύουν παρατηρήσεις, είναι πιο πιθανό να αφαιρείτε γραμμές δεδομένων· η προεπιλεγμένη ρύθμιση για το `dropna()` είναι να αφαιρεί όλες τις γραμμές που περιέχουν οποιεσδήποτε κενές τιμές: ```python example2.dropna() ``` ``` 0 1 2 1 2.0 5.0 8 ``` Αν χρειαστεί, μπορείτε να αφαιρέσετε τιμές NA από στήλες. Χρησιμοποιήστε το `axis=1` για να το κάνετε αυτό: ```python example2.dropna(axis='columns') ``` ``` 2 0 7 1 8 2 9 ``` Παρατηρήστε ότι αυτό μπορεί να αφαιρέσει πολλά δεδομένα που μπορεί να θέλετε να κρατήσετε, ιδιαίτερα σε μικρότερα σύνολα δεδομένων. Τι γίνεται αν θέλετε να αφαιρέσετε μόνο γραμμές ή στήλες που περιέχουν πολλές ή ακόμα και όλες τις τιμές κενές; Μπορείτε να ορίσετε αυτές τις ρυθμίσεις στο `dropna` με τις παραμέτρους `how` και `thresh`. Εξ ορισμού, το `how='any'` (αν θέλετε να ελέγξετε μόνοι σας ή να δείτε ποιες άλλες παραμέτρους έχει η μέθοδος, εκτελέστε `example4.dropna?` σε ένα κελί κώδικα). Εναλλακτικά, μπορείτε να ορίσετε `how='all'` ώστε να αφαιρείτε μόνο γραμμές ή στήλες που περιέχουν μόνο κενές τιμές. Ας επεκτείνουμε το παράδειγμα `DataFrame` μας για να το δούμε αυτό σε δράση. ```python example2[3] = np.nan example2 ``` | |0 |1 |2 |3 | |------|---|---|---|---| |0 |1.0|NaN|7 |NaN| |1 |2.0|5.0|8 |NaN| |2 |NaN|6.0|9 |NaN| Η παράμετρος `thresh` σας δίνει πιο λεπτομερή έλεγχο: ορίζετε τον αριθμό των *μη κενών* τιμών που χρειάζεται να έχει μια γραμμή ή μια στήλη για να διατηρηθεί: ```python example2.dropna(axis='rows', thresh=3) ``` ``` 0 1 2 3 1 2.0 5.0 8 NaN ``` Εδώ, η πρώτη και η τελευταία γραμμή έχουν αφαιρεθεί, επειδή περιέχουν μόνο δύο μη κενές τιμές. - **Συμπλήρωση κενών τιμών**: Ανάλογα με το σύνολο δεδομένων σας, μερικές φορές έχει περισσότερο νόημα να συμπληρώσετε τις κενές τιμές με έγκυρες αντί για να τις αφαιρέσετε. Μπορείτε να χρησιμοποιήσετε το `isnull` για αυτό, αλλά μπορεί να είναι κουραστικό, ιδιαίτερα αν έχετε πολλές τιμές προς συμπλήρωση. Επειδή αυτή είναι μια τόσο συχνή εργασία στην επιστήμη των δεδομένων, η pandas παρέχει το εργαλείο `fillna`, που επιστρέφει ένα αντίγραφο του `Series` ή του `DataFrame` με τις ελλείπουσες τιμές αντικατεστημένες με μια επιλογή σας. Ας δημιουργήσουμε ένα ακόμα παράδειγμα `Series` για να δούμε πώς λειτουργεί στην πράξη. ```python example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde')) example3 ``` ``` a 1.0 b NaN c 2.0 d NaN e 3.0 dtype: float64 ``` Μπορείτε να συμπληρώσετε όλες τις κενές εγγραφές με μία μόνο τιμή, όπως το `0`: ```python example3.fillna(0) ``` ``` a 1.0 b 0.0 c 2.0 d 0.0 e 3.0 dtype: float64 ``` Μπορείτε να κάνετε **προώθηση συμπλήρωσης** (forward-fill) των κενών τιμών, που σημαίνει να χρησιμοποιήσετε την τελευταία έγκυρη τιμή για να συμπληρώσετε ένα κενό: ```python example3.fillna(method='ffill') ``` ``` a 1.0 b 1.0 c 2.0 d 2.0 e 3.0 dtype: float64 ``` Μπορείτε επίσης να κάνετε **οπισθοχώρηση συμπλήρωσης** (back-fill), που είναι να διαδοθεί η επόμενη έγκυρη τιμή προς τα πίσω για να καλύψει ένα κενό: ```python example3.fillna(method='bfill') ``` ``` a 1.0 b 2.0 c 2.0 d 3.0 e 3.0 dtype: float64 ``` Όπως ίσως υποψιάζεστε, αυτό λειτουργεί το ίδιο και με τα `DataFrame`, αλλά μπορείτε επίσης να ορίσετε έναν `άξονα` κατά μήκος του οποίου θα συμπληρώνονται οι κενές τιμές. Λαμβάνοντας ξανά το προηγουμένως χρησιμοποιημένο `example2`: ```python example2.fillna(method='ffill', axis=1) ``` ``` 0 1 2 3 0 1.0 1.0 7.0 7.0 1 2.0 5.0 8.0 8.0 2 NaN 6.0 9.0 9.0 ``` Παρατηρήστε ότι όταν δεν υπάρχει διαθέσιμη προηγούμενη τιμή για την προώθηση συμπλήρωσης, η κενή τιμή παραμένει. > **Συμπέρασμα:** Υπάρχουν πολλοί τρόποι για να αντιμετωπίσετε τις ελλιπείς τιμές στα σύνολα δεδομένων σας. Η συγκεκριμένη στρατηγική που θα χρησιμοποιήσετε (αφαίρεσή τους, αντικατάστασή τους, ή ακόμα και ο τρόπος με τον οποίο τα αντικαθιστάτε) θα πρέπει να καθορίζεται από τις ιδιαιτερότητες των δεδομένων αυτών. Θα αναπτύξετε μια καλύτερη αντίληψη για το πώς να χειρίζεστε τις ελλιπείς τιμές όσο περισσότερο χειρίζεστε και αλληλοεπιδράτε με τα σύνολα δεδομένων. ## Αφαίρεση διπλότυπων δεδομένων > **Στόχος μάθησης:** Μέχρι το τέλος αυτής της υποενότητας, θα πρέπει να είστε άνετοι στην αναγνώριση και αφαίρεση διπλοτύπων τιμών από τα DataFrames. Εκτός από τα ελλιπή δεδομένα, συχνά θα συναντήσετε διπλότυπα δεδομένα σε πραγματικά σύνολα δεδομένων. Ευτυχώς, το `pandas` παρέχει έναν εύκολο τρόπο για τον εντοπισμό και την αφαίρεση διπλοτύπων. - **Αναγνώριση διπλοτύπων: `duplicated`**: Μπορείτε εύκολα να εντοπίσετε τις διπλότυπες τιμές χρησιμοποιώντας τη μέθοδο `duplicated` στο pandas, η οποία επιστρέφει μια boolean μάσκα που υποδεικνύει εάν μια εγγραφή σε ένα `DataFrame` είναι διπλότυπη μιας προηγούμενης. Ας δημιουργήσουμε ένα ακόμα παράδειγμα `DataFrame` για να το δούμε αυτό στην πράξη. ```python example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'], 'numbers': [1, 2, 1, 3, 3]}) example4 ``` | |letters|numbers| |------|-------|-------| |0 |A |1 | |1 |B |2 | |2 |A |1 | |3 |B |3 | |4 |B |3 | ```python example4.duplicated() ``` ``` 0 False 1 False 2 True 3 False 4 True dtype: bool ``` - **Αφαίρεση διπλοτύπων: `drop_duplicates`:** απλά επιστρέφει ένα αντίγραφο των δεδομένων για τα οποία όλες οι τιμές `duplicated` είναι `False`: ```python example4.drop_duplicates() ``` ``` letters numbers 0 A 1 1 B 2 3 B 3 ``` Τόσο το `duplicated` όσο και το `drop_duplicates` από προεπιλογή εξετάζουν όλες τις στήλες, αλλά μπορείτε να ορίσετε να εξετάσουν μόνο ένα υποσύνολο στηλών στο `DataFrame` σας: ```python example4.drop_duplicates(['letters']) ``` ``` letters numbers 0 A 1 1 B 2 ``` > **Συμπέρασμα:** Η αφαίρεση διπλοτύπων είναι ένα ουσιαστικό μέρος σχεδόν κάθε έργου επιστήμης δεδομένων. Τα διπλότυπα δεδομένα μπορούν να αλλάξουν τα αποτελέσματα των αναλύσεών σας και να σας δώσουν ανακριβή αποτελέσματα! ## 🚀 Πρόκληση Όλο το συζητηθέν υλικό παρέχεται ως [Jupyter Notebook](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/2-Working-With-Data/08-data-preparation/notebook.ipynb). Επιπλέον, υπάρχουν ασκήσεις μετά από κάθε ενότητα, δοκιμάστε τις! ## [Κουίζ μετά τη διάλεξη](https://ff-quizzes.netlify.app/en/ds/quiz/15) ## Επανεξέταση & Αυτο-μελέτη Υπάρχουν πολλοί τρόποι για να ανακαλύψετε και να προσεγγίσετε την προετοιμασία των δεδομένων σας για ανάλυση και μοντελοποίηση, και ο καθαρισμός των δεδομένων είναι ένα σημαντικό βήμα που είναι μια «πρακτική» εμπειρία. Δοκιμάστε αυτές τις προκλήσεις από το Kaggle για να εξερευνήσετε τεχνικές που αυτό το μάθημα δεν κάλυψε. - [Πρόκληση Καθαρισμού Δεδομένων: Ανάλυση Ημερομηνιών](https://www.kaggle.com/rtatman/data-cleaning-challenge-parsing-dates/) - [Πρόκληση Καθαρισμού Δεδομένων: Κλιμάκωση και Κανονικοποίηση Δεδομένων](https://www.kaggle.com/rtatman/data-cleaning-challenge-scale-and-normalize-data) ## Ανάθεση [Αξιολόγηση Δεδομένων από Φόρμα](assignment.md) --- **Αποποίηση ευθυνών**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.