Pandas read_csv() σε Python με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Η συνάρτηση Pandas read_csv() μετατρέπει ένα αρχείο διαχωρισμένο με κόμμα, τοπικό ή απομακρυσμένο, σε ένα DataFrame με μία μόνο κλήση. Αυτή η αναλυτική παρουσίαση εισάγει το σύνολο δεδομένων της απογραφής ενηλίκων UCI, ονομάζει τις δεκαπέντε στήλες του και συνοψίζει το αποτέλεσμα με συναθροίσεις groupby.

Εισαγωγή CSV στο Pandas
Κατά τη διάρκεια του σεμιναρίου TensorFlow, θα χρησιμοποιήσετε το σύνολο δεδομένων ενηλίκων, το οποίο χρησιμοποιείται συχνά για εργασίες ταξινόμησης. Το αρχείο που χρησιμοποιείται παρακάτω είναι το raw adult.data εξαγωγή από το Αποθετήριο Μηχανικής Μάθησης UCI και η σελίδα του συνόλου δεδομένων προσφέρει επίσης ένα αρχείο zip για λήψη και το ucimlrepo πακέτο εάν η άμεση διαδρομή σταματήσει ποτέ να επιλύεται.
Τα δεδομένα αποθηκεύονται σε μορφή CSV. Το σύνολο δεδομένων περιλαμβάνει 8 κατηγορικές μεταβλητές:
- τάξη εργασίας
- εκπαίδευση
- συζυγικός
- επάγγελμα
- σχέση
- αγώνας
- φύλο
- χώρα ιθαγένειας
Και 6 συνεχείς μεταβλητές:
- την ηλικία του
- fnlwgt
- εκπαίδευση_αριθμ
- κεφαλαιακό κέρδος
- απώλεια_κεφαλαίου
- ώρες_εβδομάδα
Μαζί με το εισόδημα label στήλη, που δημιουργεί τα 15 ονόματα στηλών στα οποία θα μεταβιβάσετε Πάντα στην επόμενη ενότητα.
Μέθοδος Pandas read_csv().
Για να εισαγάγετε ένα σύνολο δεδομένων CSV, μπορείτε να χρησιμοποιήσετε το αντικείμενο pd.read_csv(). Η βασική υπογραφή είναι:
Pandas read_csv() Σύνταξη
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- filepath_or_buffer: μονοπάτι, URLή αντικείμενο τύπου αρχείου που περιέχει τα δεδομένα
- sep=',': ο οριοθέτης που θα χρησιμοποιηθεί
- ονόματα=Κανένα: ονομάστε τις στήλες. Εάν το σύνολο δεδομένων έχει δέκα στήλες, πρέπει να δώσετε δέκα ονόματα
- index_col=Κανένα: ποια στήλη θα χρησιμοποιηθεί ως ευρετήριο γραμμής. Δώστε False για να επιβάλετε έναν νέο ακέραιο δείκτη
- skipinitialspace=Ψευδές: παράλειψη κενών μετά τον οριοθέτη
Για την πλήρη λίστα των επιχειρημάτων, ανατρέξτε στην επίσημη τεκμηρίωση pandas.read_csv().
Pandas read_csv() Παράδειγμα
Το παρακάτω απόσπασμα ονομάζει και τις 15 στήλες, δείχνει στο αρχείο UCI και αφαιρεί το κενό διάστημα που ακολουθεί κάθε κόμμα σε αυτό το συγκεκριμένο σύνολο δεδομένων.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
Παραγωγή:
(32561, 15)
Το σχήμα επιβεβαιώνει 32,561 γραμμές και 15 στήλες, επομένως κάθε όνομα στις ΣΤΗΛΕΣ αντιστοιχίστηκε σε ένα πεδίο στο αρχείο.
Παράμετροι read_csv() του Key Pandas
Η συνάρτηση read_csv() δέχεται περισσότερα από πενήντα ορίσματα, αλλά μια μικρή ομάδα καλύπτει σχεδόν κάθε πραγματική εισαγωγή. Οι παρακάτω προεπιλογές είναι αυτές που τεκμηριώνονται στην τρέχουσα αναφορά API pandas.
| Παράμετρος | Προεπιλογή | Τι κάνει |
| Σεπτέμβριος | ',' | Χαρακτήρας ή regex που χρησιμοποιείται ως οριοθέτης. Χρησιμοποιήστε sep=';' ή sep='\t' για άλλες μορφές. |
| επί κεφαλής | 'συμπεραίνω' | Αριθμός γραμμής που περιέχει τις ετικέτες στηλών. Μεταβιβάζεται η τιμή header=None όταν το αρχείο δεν έχει γραμμή κεφαλίδας. |
| ονόματα | δεν ρυθμίστηκε | Σαφής λίστα ετικετών στηλών. Συνδυάστε με την header=0 για να αντικαταστήσετε μια υπάρχουσα κεφαλίδα. |
| index_col | Ν/Α | Στήλη που θα χρησιμοποιηθεί ως ευρετήριο γραμμής. index_col=False επιβάλλει έναν απλό ακέραιο δείκτη. |
| usecols | Ν/Α | Υποσύνολο στηλών προς φόρτωση, κατά ετικέτα ή θέση. Μειώνει τόσο τον χρόνο ανάλυσης όσο και τη μνήμη. |
| dtype | Ν/Α | Τύποι δεδομένων ανά στήλη, για παράδειγμα {'age': 'int32'}. Παραλείπει την εξαγωγή συμπερασμάτων τύπου. |
| na_values | Ν/Α | Επιπλέον συμβολοσειρές για ανάγνωση ως NaN, όπως το σύμβολο κράτησης θέσης '?' στο σύνολο δεδομένων ενηλίκων. |
| skiprows / nrows | Ν/Α | Παράλειψη αρχικών γραμμών ή ανάγνωση μόνο των πρώτων N γραμμών δεδομένων. |
| ανάλυση_ημερομηνιών | Ν/Α | Στήλες για μετατροπή σε datetime κατά την ανάγνωση, σε συνδυασμό με την date_format. |
| κωδικοποίησης | 'utf-8' | Κωδικοποίηση κειμένου του αρχείου. Χρησιμοποιήστε 'latin-1' ή 'cp1252' για εξαγωγές παλαιού τύπου. |
| κομμάτια | Ν/Α | Επιστρέφει έναν επαναλήπτη που αποδίδει το αρχείο σε μπλοκ των N γραμμών. |
| σε κακές γραμμές | 'σφάλμα' | Τι να κάνετε με γραμμές με λανθασμένη μορφή: να τις αυξήσετε, να τις προειδοποιήσετε ή να τις παραλείψετε. |
Δύο από αυτά αξίζουν μια σημείωση. index_col=False δεν είναι το ίδιο με το να το αφήσετε μη ρυθμισμένο: λέει ρητά στα Panda να μην προωθήσουν την πρώτη στήλη, κάτι που θέλετε όταν ένα αρχείο τελειώνει κάθε γραμμή με έναν αδέσποτο οριοθέτη. Και names αντικαθιστά σιωπηλά ό,τι δηλώνει το αρχείο, οπότε περάστε header=0 παράλληλα με αυτό όταν το CSV φέρει πραγματικά μια γραμμή κεφαλίδας.
Μέθοδος Pandas groupby().
Ένας εύκολος τρόπος για να δείτε τα δεδομένα είναι να χρησιμοποιήσετε τη μέθοδο groupby. Αυτή η μέθοδος μπορεί να σας βοηθήσει να συνοψίσετε τα δεδομένα ανά ομάδα. Παρακάτω είναι μια λίστα με τις συγκεντρώσεις που είναι διαθέσιμες με τη μέθοδο groupby():
- μετρώ: μετρώ
- ελάχ.: ελάχ
- μέγ.: μέγ
- μέσος: μέσος
- διάμεσος: διάμεσος
- τυπική απόκλιση: std
- και άλλοι
Μέσα στην groupby(), ονομάζετε τη στήλη στην οποία θέλετε να ομαδοποιήσετε πριν εφαρμόσετε τη συνάθροιση.
Ας ρίξουμε μια ματιά σε μια μόνο ομάδαping με το σύνολο δεδομένων ενηλίκων. Θα λάβετε τον μέσο όρο όλων των συνεχών μεταβλητών ανά τύπο εσόδων, δηλαδή άνω των 50 ή κάτω των 50:
df_train.groupby(['label']).mean()
| επιγραφή | την ηλικία του | fnlwgt | εκπαίδευση_αριθμ | κεφαλαιακό κέρδος | απώλεια_κεφαλαίου | ώρες_εβδομάδα |
| <= 50 χιλ | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50 χιλ | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Μπορείτε να βρείτε την ελάχιστη ηλικία ανά τύπο νοικοκυριού:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Μπορείτε επίσης να ομαδοποιήσετε κατά πολλές στήλες. Για παράδειγμα, μπορείτε να λάβετε τη μέγιστη υπεραξία ανάλογα με τον τύπο του νοικοκυριού και την οικογενειακή κατάσταση.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
Μπορείτε να δημιουργήσετε ένα διάγραμμα μετά από μια ομαδοποίηση. Ένας τρόπος για να το κάνετε αυτό είναι να σχεδιάσετε απευθείας το ομαδοποιημένο αποτέλεσμα.
Για να δημιουργήσετε ένα πιο σαφές διάγραμμα, εφαρμόστε την unstack() μετά την mean(), έτσι ώστε η οικογενειακή κατάσταση να μετακινηθεί από τον δείκτη στις στήλες. Το διάγραμμα έχει στη συνέχεια δύο ομάδες, μία ανά ετικέτα εισοδήματος, αντί για τις δεκατέσσερις (2*7) μπάρες που θα παρήγαγε ένας επίπεδος πολυεπίπεδος δείκτης.
Εάν χρησιμοποιείτε a Jupyter σημειωματάριο, θυμηθείτε να προσθέσετε το %matplotlib εντός γραμμής, διαφορετικά δεν θα εμφανιστεί κανένα γράφημα.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Η απεικόνιση αυτού του μη στοιβαγμένου πλαισίου ως ραβδόγραμμα δίνει το παρακάτω σχήμα.
Πώς να διαβάσετε μεγάλα αρχεία CSV με το Pandas
Το σύνολο δεδομένων ενηλίκων είναι μικρό, αλλά η ίδια κλήση μπορεί να καθυστερήσει σε μια εξαγωγή πολλών gigabyte. Τρία ορίσματα κάνουν το μεγαλύτερο μέρος της δουλειάς.
- usecols φορτώνει μόνο τις στήλες που πραγματικά χρειάζεστε. Η τεκμηρίωση του pandas σημειώνει ότι αυτό έχει ως αποτέλεσμα πολύ ταχύτερη ανάλυση και χαμηλότερη χρήση μνήμης.
- dtype καρφιτσώνει κάθε στήλη σε έναν τύπο, επομένως το Pandas παραλείπει την εξαγωγή συμπερασμάτων και δεν διευρύνει τους ακέραιους αριθμούς σε 64-bit από προεπιλογή.
- κομμάτια Επιστρέφει ένα TextFileReader αντί για ένα DataFrame, επιτρέποντάς σας να κάνετε επανάληψη πάνω από μπλοκ N γραμμών και να τα αθροίζετε καθώς προχωράτε.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
Δύο επιπλέον επιλογές βοηθούν μόλις τεθούν σε εφαρμογή τα βασικά. engine='pyarrow' μεταβαίνει στον πολυνηματικό αναλυτή Arrow και dtype_backend='pyarrow' διατηρεί το αποτέλεσμα σε στήλες με βέλη πίσω από αυτά. low_memory Η προεπιλεγμένη τιμή είναι True, η οποία αναλύει το αρχείο εσωτερικά σε κομμάτια, αλλά μπορεί να παράγει μικτούς τύπους σε μια στήλη. Ορίστε έναν σαφή τύπο d αντί να βασίζεστε σε αυτόν.
Τέλος, compression='infer' σημαίνει ότι μια διαδρομή που τελειώνει σε .gz, .zip, .bz2, .xz ή .zst αποσυμπιέζεται εν κινήσει, επομένως δεν χρειάζεται να αποσυμπιέσετε ένα αρχείο πριν το διαβάσετε.
Συνηθισμένα σφάλματα read_csv() του Panda και πώς να τα διορθώσετε
Οι περισσότερες αποτυχίες της read_csv() προέρχονται από τέσσερις αιτίες και η καθεμία έχει ένα τεκμηριωμένο όρισμα που τις επιλύει.
| Λάθος | Αιτία | σταθερός |
| FileNotFoundError | Η διαδρομή είναι σχετική με τον κατάλογο εργασίας, όχι με το σενάριο. | Χρησιμοποιήστε μια απόλυτη διαδρομή ή επιβεβαιώστε την URL Το σχήμα είναι ένα από τα http, ftp, s3, gs ή αρχείο. |
| Σφάλμα Αποκωδικοποίησης Unicode | Το αρχείο δεν είναι UTF-8, που είναι η προεπιλεγμένη κωδικοποίηση. | Δώστε encoding='latin-1' ή τον σωστό κωδικοποιητή ή encoding_errors='replace'. |
| ParserError: Σφάλμα κατά την μετατροπή δεδομένων σε διακριτικά | Μια γραμμή περιέχει περισσότερα πεδία από όσα δηλώνει η κεφαλίδα. | Μεταφέρετε την εντολή on_bad_lines='skip' ή 'warn' ή ορίστε τη σωστή τιμή sep. |
| DtypeWarning: οι στήλες έχουν μικτούς τύπους | Η συμπερασματοποίηση τμηματικών τύπων είδε διαφορετικούς τύπους σε μία στήλη. | Ορίστε έναν σαφή τύπο d ή low_memory=False. |
| Στήλες που μετατοπίστηκαν κατά ένα | Ένας τελικός οριοθέτης κάνει τα Panda να προωθούν το πρώτο πεδίο στο ευρετήριο. | Επιτυχία index_col=Λάθος. |
Το σύνολο δεδομένων ενηλίκων εμφανίζει απευθείας την περίπτωση της ελλείπουσας τιμής: οι καταχωρήσεις άγνωστης τάξης εργασίας, επαγγέλματος και χώρας_γης αποθηκεύονται ως ένα πραγματικό ερωτηματικό, επομένως φτάνουν ως η συμβολοσειρά '?', εκτός εάν τις δηλώσετε.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

