Οι τιμές που λείπουν είναι συχνές και προκύπτουν είτε λόγω ανθρώπινου λάθους, σφάλματος οργάνου, επεξεργασίας από άλλη ομάδα ή αλλιώς απλώς έλλειψης δεδομένων για μια συγκεκριμένη παρατήρηση.
Σε αυτό το Byte, θα ρίξουμε μια ματιά στον τρόπο συμπλήρωσης NaNs σε ένα
DataFrame
, εάν επιλέξετε να χειριστείτε NaN συμπληρώνοντάς τα.
Αρχικά, ας δημιουργήσουμε μια κοροϊδία DataFrame
με κάποιες τυχαίες τιμές που απορρίφθηκαν:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
Ας σχεδιάσουμε, ας πούμε, την τρίτη στήλη:
plt.plot(df['Col3'])
Όταν γεμίζεται με διάφορες τεχνικές – αυτό το γεμάτο NaN γράφημα μπορεί να αντικατασταθεί με:
fillna() – Μέσος όρος, Διάμεσος, Λειτουργία
Μπορείτε να συμπληρώσετε αυτές τις τιμές σε μια νέα στήλη και να την αντιστοιχίσετε στη στήλη που θέλετε να συμπληρώσετε ή επιτόπου χρησιμοποιώντας το inplace
διαφωνία. Εδώ, θα εξαγάγουμε τις συμπληρωμένες τιμές σε μια νέα στήλη για ευκολία στον έλεγχο:
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
Η διάμεσος, ο μέσος όρος και ο τρόπος λειτουργίας της στήλης είναι -0.187669
, -0.110873
και 0.000000
και αυτές οι τιμές θα χρησιμοποιηθούν για κάθε NaN αντίστοιχα. Αυτό ουσιαστικά γεμίζει με σταθερές τιμές, όπου η τιμή που εισάγεται εξαρτάται από την ολότητα της στήλης.
Πρώτον, η συμπλήρωση με διάμεσες τιμές έχει ως αποτέλεσμα:
Με μέσες τιμές:
Με τιμές λειτουργίας:
fillna() – Σταθερή τιμή
Μπορείτε επίσης να συμπληρώσετε με μια σταθερή τιμή αντί:
Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!
constant = df['Col3'].fillna(0, inplace=False
Αυτό έχει ως αποτέλεσμα να τοποθετείται μια σταθερή τιμή (0) αντί για κάθε NaN. 0
είναι κοντά στη διάμεσο και μέση και ίση με τη λειτουργία, επομένως οι συμπληρωμένες τιμές θα μοιάζουν πολύ με αυτήν τη μέθοδο για το εικονικό μας σύνολο δεδομένων:
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna() – Γέμισμα προς τα εμπρός και προς τα πίσω
Σε κάθε σειρά – μπορείτε να κάνετε ένα γέμισμα προς τα εμπρός ή προς τα πίσω, λαμβάνοντας την τιμή είτε από τη σειρά πριν είτε μετά:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
Με τη συμπλήρωση προς τα εμπρός, αφού λείπουμε από τη σειρά 2 – η τιμή από τη σειρά 1 λαμβάνεται για να συμπληρωθεί η δεύτερη. Οι τιμές διαδίδονται προς τα εμπρός:
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Με το γέμισμα προς τα πίσω, συμβαίνει το αντίθετο. Η σειρά 2 συμπληρώνεται με την τιμή από τη σειρά 3:
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Ωστόσο, αν υπάρχουν περισσότερα από ένα NaN
σε μια ακολουθία – αυτά δεν θα πάνε καλά και μπορούν να καταρρεύσουν τα NaN πιο κάτω, παραμορφώνοντας τα δεδομένα και αφαιρώντας τις πραγματικά καταγεγραμμένες τιμές.
παρεμβάλλω()
Η interpolate()
Η μέθοδος αναθέτει την παρεμβολή τιμών σε SciPy's σειρά μεθόδων για παρεμβολή τιμών. Αποδέχεται μια μεγάλη ποικιλία επιχειρημάτων, όπως: nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
Κ.λπ.
Η παρεμβολή είναι πολύ πιο ευέλικτη και «έξυπνη» από την απλή πλήρωση τιμών με σταθερές ή μισές μεταβλητές όπως οι προηγούμενες μέθοδοι.
Η παρεμβολή μπορεί να γεμίσει σωστά μια ακολουθία με τρόπο που καμία άλλη μέθοδος δεν μπορεί, όπως:
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
Η προεπιλεγμένη παρεμβολή είναι γραμμική και υποθέτοντας ότι 1...5
είναι πιθανό α 1, 2, 3, 4, 5
Η ακολουθία δεν είναι τραβηγμένη (αλλά δεν είναι εγγυημένη). Τόσο το συνεχές γέμισμα όσο και το γέμισμα προς τα εμπρός ή προς τα πίσω αποτυγχάνουν παταγωδώς εδώ. Σε γενικές γραμμές - η παρεμβολή θα είναι συνήθως ένας καλός φίλος όταν πρόκειται να γεμίσει NaN σε θορυβώδη σήματα ή κατεστραμμένα σύνολα δεδομένων.
Ο πειραματισμός με τύπους παρεμβολής μπορεί να αποφέρει καλύτερα αποτελέσματα.
Εδώ είναι δύο μέθοδοι παρεμβολής (splice
και polynomial
απαιτούν ένα order
διαφωνία):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
Αυτά έχουν ως αποτέλεσμα:
Και: