Ένας διαδραστικός οδηγός για την τάξη και το σπίτι, σε 8 βήματα. Το pandas είναι η βιβλιοθήκη που κάνει την Python «Excel με κώδικα»: πίνακες με ονόματα στηλών, διαφορετικό τύπο ανά στήλη, φόρτωση από αρχείο με μία γραμμή. Ο κώδικας τρέχει μέσα στον browser σου, μαζί με το αρχείο store_orders.csv (60 παραγγελίες του καταστήματος της εβδομάδας 3). Την πρώτη φορά η φόρτωση του pandas θέλει 10–20 δευτερόλεπτα.
Ένα λεξικό (dictionary) κρατά ζεύγη κλειδί → τιμή μέσα σε άγκιστρα: {"laptop": 899.0, "mouse": 19.9}. Αντί για θέση (όπως στη λίστα) ζητάς την τιμή με το κλειδί της. Θα το δεις συνέχεια στο pandas, γι' αυτό μαθαίνουμε μόνο τα βασικά.
Ένα DataFrame είναι ένας πίνακας με ονόματα στηλών, όπου κάθε στήλη μπορεί να έχει διαφορετικό τύπο: ακριβώς αυτό που δεν μπορούσε η NumPy. Ο πιο απλός τρόπος να φτιάξεις ένα: ένα λεξικό όπου κάθε κλειδί είναι όνομα στήλης και κάθε τιμή μια λίστα με τα περιεχόμενά της.
import pandas as pd είναι η σύμβαση, όπως το np.Λεξικό με τρία κλειδιά (τα ονόματα των στηλών) και τρεις λίστες ίδιου μήκους, μέσα σε pd.DataFrame().
Στην πράξη τα δεδομένα έρχονται από αρχεία. Το CSV (comma-separated values) είναι ένα απλό αρχείο κειμένου: μία γραμμή ανά εγγραφή, τιμές χωρισμένες με κόμμα, πρώτη γραμμή τα ονόματα των στηλών. Το pd.read_csv() το διαβάζει σε DataFrame με μία γραμμή. Μετά, οι πρώτες τέσσερις ερωτήσεις είναι πάντα οι ίδιες: πώς μοιάζει, πόσο είναι, τι τύπους έχει, τι τιμές παίρνει.
Το info() δείχνει για κάθε στήλη τον τύπο (dtype) και πόσες τιμές δεν είναι κενές (non-null). Τα object είναι κείμενο. Πρόσεξε τη στήλη city: 56 από 60.
Για τις αριθμητικές στήλες: πλήθος, μέσος όρος, τυπική απόκλιση, ελάχιστο, τεταρτημόρια, μέγιστο. Το columns και το dtypes δίνουν τα ονόματα και τους τύπους σκέτους.
order_id είναι αριθμός, άρα το describe() του βγάζει μέσο όρο (1030.5) που δεν σημαίνει τίποτα. Η στατιστική δεν ξέρει τι είναι «ταυτότητα» και τι «μέγεθος»· εσύ ξέρεις.Φόρτωσε το αρχείο και απάντησε στις τρεις ερωτήσεις. Για τον μέγιστο μπορείς να διαβάσεις το describe() ή να κάνεις orders["quantity"].max() (το επόμενο βήμα εξηγεί γιατί δουλεύει).
Με μονές αγκύλες και ένα όνομα παίρνεις μία στήλη, που είναι ένα Series (ένας πίνακας NumPy με ετικέτες και όνομα). Με διπλές αγκύλες και μια λίστα ονομάτων παίρνεις ένα μικρότερο DataFrame. Η διαφορά έχει σημασία: το Series έχει μεθόδους στατιστικής, το DataFrame είναι πίνακας.
Ένα Series έχει sum(), mean(), max() όπως ο πίνακας NumPy, και δύο νέα που θα χρησιμοποιείς συνέχεια σε στήλες κειμένου: unique() (ποιες διαφορετικές τιμές υπάρχουν) και value_counts() (πόσες φορές η καθεμία, ταξινομημένες).
orders.quantity κάνει το ίδιο με το orders["quantity"], και το βλέπεις συχνά. Οι αγκύλες όμως δουλεύουν πάντα (και με κενά στο όνομα, και όταν το όνομα συμπίπτει με μέθοδο, και για νέες στήλες), γι' αυτό στο μάθημα κρατάμε τις αγκύλες.Τρεις στήλες, τρεις μέθοδοι. Παρατήρησε το nan ανάμεσα στις πόλεις: οι κενές τιμές μετρούν ως «τιμή» στο unique (το βήμα 7 ασχολείται μαζί τους).
Για γραμμές υπάρχουν δύο εργαλεία. Το iloc[] δουλεύει με θέσεις (0, 1, 2… όπως η NumPy: [γραμμή, στήλη], slicing, αρνητικοί δείκτες). Το loc[] δουλεύει με ετικέτες: την ετικέτα του ευρετηρίου για τη γραμμή και το όνομα της στήλης. Όσο το ευρετήριο είναι 0, 1, 2… τα δύο μοιάζουν· η διαφορά φαίνεται μόλις αλλάξεις ευρετήριο.
loc περιλαμβάνει και το τελευταίο (loc[:2] δίνει 3 γραμμές), στο iloc όχι (iloc[:2] δίνει 2), όπως στις λίστες.Μία φορά με θέση, μία με ετικέτα, μία με αρνητικό δείκτη. Τρεις γραμμές εξόδου: Athens, 3, mouse.
Το boolean filtering της NumPy, αυτούσιο: μια σύγκριση σε στήλη δίνει Series από True/False, και μέσα στις αγκύλες του DataFrame κρατά τις γραμμές όπου είναι True. Δύο συνθήκες με & / | και παρενθέσεις, όπως πριν. Νέο: το isin() για «μία από αυτές τις τιμές».
Γράψε μια συνθήκη και δες ποιες γραμμές «περνούν». Δοκίμασε quantity > 5, item == "laptop", (category == "accessories") & (channel == "store"), (unit_price > 200) | (quantity >= 8):
orders[orders["quantity"] > 5 and orders["channel"] == "online"] δίνει ValueError: The truth value of a Series is ambiguous. Όπως και στη NumPy: & με παρενθέσεις.Τρία φίλτρα, δύο από αυτά με δύο συνθήκες. Τύπωσε 5, 12 και μετά τον πίνακα με τις παραγγελίες από Larisa.
Το sort_values("στήλη") επιστρέφει νέο DataFrame ταξινομημένο (αύξουσα· ascending=False για φθίνουσα). Με λίστα στηλών ταξινομεί πρώτα κατά την πρώτη, μετά κατά τη δεύτερη. Το «top 3» είναι απλώς ταξινόμηση + head(3).
Ανάθεση σε όνομα που δεν υπάρχει ακόμη δημιουργεί στήλη. Ο υπολογισμός γίνεται στοιχείο προς στοιχείο, όπως στη NumPy: orders["revenue"] = orders["unit_price"] * orders["quantity"]. Από εκεί και πέρα η νέα στήλη είναι σαν όλες τις άλλες: φίλτρα, ταξινόμηση, στατιστικά.
Νέα στήλη, φίλτρο πάνω της, ταξινόμηση κατά αυτήν. Η δεύτερη ερώτηση συνδυάζει φίλτρο σε μία στήλη και άθροισμα σε άλλη: orders[φίλτρο]["revenue"].sum().
Στα πραγματικά δεδομένα λείπουν τιμές, και το pandas τις δείχνει ως NaN (Not a Number). Τρία εργαλεία: isna() (πού λείπουν), fillna(τιμή) (γέμισέ τες) και dropna() (πέτα τις γραμμές). Οι στατιστικές μέθοδοι τις αγνοούν σιωπηλά, γι' αυτό πρέπει να ξέρεις ότι υπάρχουν.
| Μήνυμα | Τι σημαίνει | Διόρθωση |
|---|---|---|
| KeyError: 'Item' | Δεν υπάρχει στήλη με αυτό το όνομα (κεφαλαία/πεζά, κενά) | Δες τα ονόματα: orders.columns |
| ValueError: The truth value of a Series is ambiguous | and / or ανάμεσα σε συνθήκες | & / | με παρενθέσεις |
| FileNotFoundError: store_orders.csv | Το αρχείο δεν είναι εκεί που τρέχει ο κώδικας | Ανέβασέ το (Colab) ή δώσε τη σωστή διαδρομή |
| AttributeError: 'DataFrame' object has no attribute 'Quantity' | Η γραφή με τελεία με λάθος όνομα στήλης | Αγκύλες και σωστό όνομα: orders["quantity"] |
Τρέξε, διάβασε, διόρθωσε ένα σφάλμα τη φορά:
Ένα SyntaxError, ένα KeyError και ένα ValueError. Πάτησε «Έλεγξε», διάβασε το μήνυμα, διόρθωσε, ξαναπάτησε.
Δώδεκα ερωτήσεις από όλη την εβδομάδα. Σκέψου πρώτα, μετά απάντησε· αν αμφιβάλλεις, άνοιξε το παράθυρο κώδικα στο τέλος και δοκίμασέ το.
groupby.