Importa file CSV come DataFrame panda


91

Qual è il modo in cui Python legge un file CSV in un DataFrame panda (che posso quindi utilizzare per operazioni statistiche, può avere colonne di tipo diverso, ecc.)?

Il mio file CSV "value.txt"ha il seguente contenuto:

Date,"price","factor_1","factor_2"
2012-06-11,1600.20,1.255,1.548
2012-06-12,1610.02,1.258,1.554
2012-06-13,1618.07,1.249,1.552
2012-06-14,1624.40,1.253,1.556
2012-06-15,1626.15,1.258,1.552
2012-06-16,1626.15,1.263,1.558
2012-06-17,1626.15,1.264,1.572

In R leggiamo questo file usando:

price <- read.csv("value.txt")  

e questo restituirebbe un R data.frame:

> price <- read.csv("value.txt")
> price
     Date   price factor_1 factor_2
1  2012-06-11 1600.20    1.255    1.548
2  2012-06-12 1610.02    1.258    1.554
3  2012-06-13 1618.07    1.249    1.552
4  2012-06-14 1624.40    1.253    1.556
5  2012-06-15 1626.15    1.258    1.552
6  2012-06-16 1626.15    1.263    1.558
7  2012-06-17 1626.15    1.264    1.572

Esiste un modo pitonico per ottenere la stessa funzionalità?


elogiereste ciò che ha di speciale il dataframe e quale operazione statistica potete fare con esso?
LWZ

3
dataframe può contenere più di un tipo di dati, ad esempio ogni colonna può essere una lista, e puoi trattare ogni lista individualmente applicando alcune funzioni su di essa e parlando di operazioni statistiche, come avere media, deviazione standard, quartile,. ..
mazlor

Grazie! Questo in realtà è molto utile per me. Ho sempre caricato il file csv con il modulo csv che mi fornisce un elenco di elenchi. Questo data.frame suona molto meglio!
LWZ

@LWZ: vedi le mie modifiche e il link, lmk se questo risponde sinteticamente alle tue domande. Questo è quanto possiamo fare qui per "vendere" il pacchetto di vantaggi. La domanda più ampia "Quali sono i vantaggi dell'utilizzo di un dataframe panda su un semplice array / elenco di elenchi Python?" ha molti vantaggi, troppi per elencarli qui ...
smci

Risposte:


160

panda in soccorso:

import pandas as pd
print pd.read_csv('value.txt')

        Date    price  factor_1  factor_2
0  2012-06-11  1600.20     1.255     1.548
1  2012-06-12  1610.02     1.258     1.554
2  2012-06-13  1618.07     1.249     1.552
3  2012-06-14  1624.40     1.253     1.556
4  2012-06-15  1626.15     1.258     1.552
5  2012-06-16  1626.15     1.263     1.558
6  2012-06-17  1626.15     1.264     1.572

Ciò restituisce panda DataFrame simile a R's.


10

Per leggere un file CSV come DataFrame panda, dovrai usare pd.read_csv.

Ma non è qui che finisce la storia; i dati esistono in molti formati diversi e vengono archiviati in modi diversi, quindi sarà spesso necessario passare parametri aggiuntivi read_csvper garantire che i dati vengano letti correttamente.

Ecco una tabella che elenca gli scenari comuni riscontrati con i file CSV insieme all'argomento appropriato che dovrai utilizzare. Di solito avrai bisogno di tutti o di una combinazione degli argomenti seguenti per leggere i tuoi dati.

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  ScenarioArgumentExample                                               │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│  Read CSV with different separator¹                      │  sep/delimiter              │  read_csv(..., sep=';')                                │
│  Read CSV with tab/whitespace separator                  │  delim_whitespace           │  read_csv(..., delim_whitespace=True)                  │
│  Fix UnicodeDecodeError while reading²                   │  encoding                   │  read_csv(..., encoding='latin-1')                     │
│  Read CSV without headers³                               │  header and names           │  read_csv(..., header=False, names=['x', 'y', 'z'])    │
│  Specify which column to set as the index⁴               │  index_col                  │  read_csv(..., index_col=[0])                          │
│  Read subset of columns                                  │  usecols                    │  read_csv(..., usecols=['x', 'y'])                     │
│  Numeric data is in European format (eg., 1.234,56)      │  thousands and decimal      │  read_csv(..., thousands='.', decimal=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

Note a piè di pagina

  1. Per impostazione predefinita, read_csvutilizza un motore parser C per le prestazioni. Il parser C può gestire solo separatori di caratteri singoli. Se il tuo CSV ha un separatore multi-carattere, dovrai modificare il codice per utilizzare il 'python'motore. Puoi anche trasmettere espressioni regolari:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorsi verifica quando i dati sono stati memorizzati in un formato di codifica ma letti in un altro, incompatibile. Gli schemi di codifica più comuni sono 'utf-8'e 'latin-1', è probabile che i tuoi dati rientrino in uno di questi.

  3. header=Falsespecifica che la prima riga nel CSV è una riga di dati piuttosto che una riga di intestazione e names=[...]consente di specificare un elenco di nomi di colonne da assegnare al DataFrame quando viene creato.

  4. "Senza nome: 0" si verifica quando un DataFrame con un indice senza nome viene salvato in CSV e quindi riletto. Invece di dover risolvere il problema durante la lettura, puoi anche risolvere il problema durante la scrittura utilizzando

    df.to_csv(..., index=False)
    

Ci sono altri argomenti che non ho menzionato qui, ma questi sono quelli che incontrerai più frequentemente.


1
Puoi per favore incollare / riformattare la tabella come immagine come testo Unicode usando ad esempio ozh.github.io/ascii-tables ? Altrimenti è difficile da leggere e non verrà indicizzato per la ricerca di contenuto o individuabile con la semplice ricerca di testo Ctrl-F.
smci

@smci Sono d'accordo con quello che hai detto sull'indicizzazione (oltre al fatto che le immagini non possono essere modificate da altre persone) ma non sembra altrettanto buono e richiede lo scorrimento che lo rende difficile da seguire.
cs95

comunque è necessario riscriverlo per essere facile da usare per un nuovo utente; invece di cose incomprensibili come "Evita" Senza nome: 0 "" dovrebbe dire qualcosa di inglese semplice come " index_col: dì ai panda quale colonna utilizzare come indice per il tuo dataframe"
smci

@smci Sembra che le tabelle ASCII non giochino bene con gli apici: rovina la formattazione della tabella.
cs95

cs95: ho consigliato Unicode, non ASCII. Unicode funziona bene. Quindi cambia l'impostazione predefinita nel menu
smci

9

Ecco un'alternativa alla libreria pandas usando il modulo csv integrato di Python .

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = {h:[] for h in headers}
    for row in reader:
        for h, v in zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

stamperà

{'Date': ['2012-06-11',
          '2012-06-12',
          '2012-06-13',
          '2012-06-14',
          '2012-06-15',
          '2012-06-16',
          '2012-06-17'],
 'factor_1': ['1.255', '1.258', '1.249', '1.253', '1.258', '1.263', '1.264'],
 'factor_2': ['1.548', '1.554', '1.552', '1.556', '1.552', '1.558', '1.572'],
 'price': ['1600.20',
           '1610.02',
           '1618.07',
           '1624.40',
           '1626.15',
           '1626.15',
           '1626.15']}

6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Questo importerà il tuo file .txt o .csv in un DataFrame.



1
%cd C:\Users\asus\Desktop\python
import pandas as pd
df = pd.read_csv('value.txt')
df.head()
    Date    price   factor_1    factor_2
0   2012-06-11  1600.20 1.255   1.548
1   2012-06-12  1610.02 1.258   1.554
2   2012-06-13  1618.07 1.249   1.552
3   2012-06-14  1624.40 1.253   1.556
4   2012-06-15  1626.15 1.258   1.552

0

Puoi usare il modulo csv che si trova nella libreria standard di Python per manipolare i file CSV.

esempio:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

-0. Provenendo da R, mazlor non cercherebbe il csvmodulo in quanto è di livello troppo basso. pandasfornisce il livello di astrazione richiesto.
Steven Rumbalski

... inoltre legge i dati in un utile oggetto Python come un array numpy ...
Paul Hiemstra

0

importa i panda come
dataset pd = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')


-1

Nota abbastanza pulito, ma:

import csv

with open("value.txt", "r") as f:
    csv_reader = reader(f)
    num = '  '
    for row in csv_reader:
        print num, '\t'.join(row)
        if num == '  ':  
            num=0
        num=num+1

Non così compatto, ma fa il lavoro:

   Date price   factor_1    factor_2
1 2012-06-11    1600.20 1.255   1.548
2 2012-06-12    1610.02 1.258   1.554
3 2012-06-13    1618.07 1.249   1.552
4 2012-06-14    1624.40 1.253   1.556
5 2012-06-15    1626.15 1.258   1.552
6 2012-06-16    1626.15 1.263   1.558
7 2012-06-17    1626.15 1.264   1.572

1
Questo non risponde alla domanda dell'OP in quanto non legge i dati csv in un oggetto Python.
Paul Hiemstra

forse sostituire il num con enumerate nel ciclo for?
LWZ

@PaulHiemstra, OP non ha menzionato "oggetto", ma chiedo facilità. Tuttavia, sospetto che l'approccio "panda" si adatti meglio a ciò che è stato chiesto.
Lee-Man
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.