Pandas read_csv() σε Python με Παράδειγμα

⚡ Έξυπνη Σύνοψη

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

  • 🔘 Μία κλήση: Η pd.read_csv() δέχεται μια διαδρομή αρχείου, ένα URLή οποιοδήποτε αντικείμενο που εκθέτει μια μέθοδο ανάγνωσης.
  • ☑️ Έλεγχος στήλης: Μεταβιβάστε ονόματα για να επισημάνετε τις στήλες και index_col=False για να διατηρήσετε έναν απλό ακέραιο δείκτη.
  • ✅ Κενό διάστημα: skipinitialspace=Το True αφαιρεί το κενό διάστημα που ακολουθεί κάθε κόμμα στο σύνολο δεδομένων ενηλίκων.
  • 🧪 Ομαδοποίηση και συγκεντρωτικό σύνολο: Η groupby() συνοψίζει το πλαίσιο με count, min, max, mean, median ή std.
  • ️ Μεγάλα αρχεία: Οι usecols, dtype και chunksize μειώνουν τον χρόνο ανάλυσης και τη μνήμη σε εξαγωγές πολλών gigabyte.
  • ⚠️ Συνηθισμένα σφάλματα: Η κωδικοποίηση, οι κατεστραμμένες γραμμές και οι μικτοί τύποι d έχουν το καθένα ένα τεκμηριωμένο όρισμα που τα διορθώνει.

Pandas read_csv() με Παράδειγμα

Εισαγωγή 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)

Συχνές Ερωτήσεις

Και οι δύο καλούν τον ίδιο αναλυτή. Η συνάρτηση read_csv() χρησιμοποιεί από προεπιλογή έναν διαχωριστή κόμματος, ενώ η συνάρτηση read_table() διαβάζει ένα αρχείο με γενικό διαχωρισμό και αναμένει να ορίσετε εσείς οι ίδιοι την συνάρτηση sep. Χρησιμοποιήστε την συνάρτηση read_csv() για αρχεία με κόμμα και την συνάρτηση read_table() για εξαγωγές διαχωρισμένες με στηλοθέτες ή πίσσα.

Κλήση της συνάρτησης df.to_csv('output.csv', index=False). Απόρριψηping Το ευρετήριο αποφεύγει μια ανώνυμη πρώτη στήλη στην επόμενη ανάγνωση. Προσθέστε ορίσματα sep, κωδικοποίησης ή συμπίεσης για να αντικατοπτρίσετε οποιεσδήποτε ρυθμίσεις χρησιμοποιήσατε κατά την εισαγωγή του αρχείου.

Μεταβιβάστε την συνάρτηση parse_dates με τα ονόματα ή τις θέσεις των στηλών και προσθέστε την συνάρτηση date_format όταν η διάταξη δεν είναι ISO 8601, για παράδειγμα date_format='%d/%m/%Y'. Χωρίς αυτήν, οι στήλες ημερομηνίας φτάνουν ως απλές συμβολοσειρές αντικειμένων και χρειάζονται ξεχωριστή κλήση to_datetime.

Ορίστε τον χαρακτήρα sep, όπως sep=';' ή sep='\t'. Οι διαχωριστές που είναι μεγαλύτεροι από έναν χαρακτήρα αντιμετωπίζονται ως κανονικές εκφράσεις και επιβάλλουν την πιο αργή Python engine. sep=Κανένα δεν επιτρέπει σε αυτόν τον μηχανισμό να αντιληφθεί τον οριοθέτη από την πρώτη έγκυρη γραμμή.

Χρησιμοποιήστε τη συνάρτηση nrows για να περιορίσετε τον αριθμό των γραμμών δεδομένων που επιστρέφονται και τη συνάρτηση skiprows για να περάσετε ένα μπλοκ από κορυφαίες γραμμές. Συνδυάστε τις σελίδες σε ένα αρχείο, για παράδειγμα skiprows=1000000 με nrows=999999 για να διαβάσετε το δεύτερο εκατομμύριο γραμμές.

Ναι. Η συμπίεση έχει προεπιλεγμένη τιμή 'infer', επομένως μια διαδρομή που τελειώνει σε .gz, .zip, .bz2, .xz ή .zst αποσυμπιέζεται αυτόματα. URLs χρησιμοποιώντας http, ftp, s3, gs ή αρχείο λειτουργεί όλο και περισσότερο, και η εντολή storage_options μεταβιβάζει τα διαπιστευτήρια στο απομακρυσμένο backend.

Τα εκπαιδευμένα μοντέλα επισημαίνουν πιθανά σφάλματα τύπου, ομαδοποιούν σχεδόν διπλότυπες ορθογραφίες κατηγοριών και αποδίδουν τιμές που λείπουν από τις γύρω στήλες. Αυτό περιορίζει τον χειροκίνητο καθαρισμό στις γραμμές που μια ρύθμιση na_values ​​ή dtype που βασίζεται σε κανόνες δεν μπορεί να επιλύσει από μόνη της.

Το Copilot συντάσσει γρήγορα το στερεότυπο μόλις μπορεί να δει ένα δείγμα του αρχείου. Αντιμετωπίστε τη λίστα ορισμάτων ως προσχέδιο, επειδή συχνά μαντεύει τον τύπο d και την κωδικοποίηση. Ελέγξτε κάθε λέξη-κλειδί που δημιουργείται σε σχέση με την αναφορά API pandas πριν την εκτελέσετε.

Συνοψίστε αυτήν την ανάρτηση με: