|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "1b560955ff39a2bcf2a049fce474a951",
|
|
|
"translation_date": "2025-09-05T21:07:33+00:00",
|
|
|
"source_file": "2-Working-With-Data/08-data-preparation/README.md",
|
|
|
"language_code": "el"
|
|
|
}
|
|
|
-->
|
|
|
# Εργασία με Δεδομένα: Προετοιμασία Δεδομένων
|
|
|
|
|
|
| ](../../sketchnotes/08-DataPreparation.png)|
|
|
|
|:---:|
|
|
|
|Προετοιμασία Δεδομένων - _Σκίτσο από [@nitya](https://twitter.com/nitya)_ |
|
|
|
|
|
|
## [Προ-Διάλεξη Κουίζ](https://ff-quizzes.netlify.app/en/ds/quiz/14)
|
|
|
|
|
|
Ανάλογα με την πηγή τους, τα ακατέργαστα δεδομένα μπορεί να περιέχουν ασυνέπειες που προκαλούν δυσκολίες στην ανάλυση και τη μοντελοποίηση. Με άλλα λόγια, αυτά τα δεδομένα μπορούν να χαρακτηριστούν ως "βρώμικα" και θα χρειαστεί να καθαριστούν. Αυτό το μάθημα επικεντρώνεται σε τεχνικές καθαρισμού και μετασχηματισμού δεδομένων για την αντιμετώπιση προβλημάτων όπως ελλιπή, ανακριβή ή ατελή δεδομένα. Τα θέματα που καλύπτονται σε αυτό το μάθημα χρησιμοποιούν Python και τη βιβλιοθήκη Pandas και θα [παρουσιαστούν στο notebook](../../../../2-Working-With-Data/08-data-preparation/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, καθώς και τις πρώτες και τελευταίες γραμμές.
|
|
|
|
|
|
Για να εξερευνήσουμε αυτή τη λειτουργικότητα, θα εισάγουμε τη βιβλιοθήκη Python scikit-learn και θα χρησιμοποιήσουμε ένα εμβληματικό σύνολο δεδομένων: το **Iris data set**.
|
|
|
|
|
|
```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'])
|
|
|
```
|
|
|
| |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.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 χρησιμοποιεί το αντικείμενο `None` της Python. Ενώ μπορεί να φαίνεται μπερδεμένο ότι θα συναντήσετε δύο διαφορετικά είδη τιμών που λένε ουσιαστικά το ίδιο πράγμα, υπάρχουν βάσιμοι προγραμματιστικοί λόγοι για αυτήν την επιλογή σχεδίασης και, στην πράξη, αυτή η προσέγγιση επιτρέπει στο pandas να προσφέρει έναν καλό συμβιβασμό για τη συντριπτική πλειονότητα των περιπτώσεων. Παρ' όλα αυτά, τόσο το `None` όσο και το `NaN` φέρουν περιορισμούς που πρέπει να έχετε υπόψη σας σχετικά με το πώς μπορούν να χρησιμοποιηθούν.
|
|
|
|
|
|
Δείτε περισσότερα για το `NaN` και το `None` από το [notebook](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`s: δείχνουν τα αποτελέσματα και τον δείκτη αυτών των αποτελεσμάτων, κάτι που θα σας βοηθήσει πολύ καθώς παλεύετε με τα δεδομένα σας.
|
|
|
|
|
|
- **Αφαίρεση κενών τιμών**: Πέρα από την αναγνώριση ελλειπόντων τιμών, το pandas παρέχει έναν βολικό τρόπο για να αφαιρέσετε κενές τιμές από `Series` και `DataFrame`s. (Ιδιαίτερα σε μεγάλα σύνολα δεδομένων, είναι συχνά πιο συνετό να αφαιρέσετε απλώς τις ελλείπουσες [NA] τιμές από την ανάλυσή σας παρά να τις αντιμετωπίσετε με άλλους τρόπους.) Για να το δείτε αυτό στην πράξη, ας επιστρέψουμε στο `example1`:
|
|
|
```python
|
|
|
example1 = example1.dropna()
|
|
|
example1
|
|
|
```
|
|
|
```
|
|
|
0 0
|
|
|
2
|
|
|
dtype: object
|
|
|
```
|
|
|
Σημειώστε ότι αυτό θα πρέπει να μοιάζει με την έξοδό σας από το `example3[example3.notnull()]`. Η διαφορά εδώ είναι ότι, αντί να κάνετε απλώς δείκτη στις τιμές της μάσκας, το `dropna` έχει αφαιρέσει αυτές τις ελλείπουσες τιμές από τη `Series` `example1`.
|
|
|
|
|
|
Επειδή τα `DataFrame`s έχουν δύο διαστάσεις, προσφέρουν περισσότερες επιλογές για την αφαίρεση δεδομένων.
|
|
|
|
|
|
```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 ανέβασε δύο από τις στήλες σε κινητές υποδιαστολές για να φιλοξενήσει τα `NaN`s;)
|
|
|
|
|
|
Δεν μπορείτε να αφαιρέσετε μια μεμονωμένη τιμή από ένα `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` για να το κάνετε αυτό στη θέση του, αλλά αυτό μπορεί να είναι κου
|
|
|
> **Συμπέρασμα:** Υπάρχουν πολλοί τρόποι για να αντιμετωπίσετε τις ελλείπουσες τιμές στα σύνολα δεδομένων σας. Η συγκεκριμένη στρατηγική που θα χρησιμοποιήσετε (αφαίρεση, αντικατάσταση ή ακόμα και ο τρόπος αντικατάστασης) θα πρέπει να καθορίζεται από τις ιδιαιτερότητες αυτών των δεδομένων. Θα αποκτήσετε καλύτερη αίσθηση για το πώς να διαχειρίζεστε τις ελλείπουσες τιμές όσο περισσότερο ασχολείστε και αλληλεπιδράτε με σύνολα δεδομένων.
|
|
|
## Αφαίρεση διπλότυπων δεδομένων
|
|
|
|
|
|
> **Στόχος μάθησης:** Μέχρι το τέλος αυτής της υποενότητας, θα πρέπει να είστε άνετοι με την αναγνώριση και την αφαίρεση διπλότυπων τιμών από 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). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. |