Importar arquivo CSV como um DataFrame do pandas

98

Qual é a maneira do Python de ler um arquivo CSV em um DataFrame do pandas (que posso usar para operações estatísticas, pode ter colunas com tipos diferentes, etc.)?

Meu arquivo CSV "value.txt"tem o seguinte conteúdo:

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

Em R, leríamos este arquivo usando:

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

e isso retornaria um 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

Existe uma maneira Pythônica de obter a mesma funcionalidade?

Mazlor
fonte
você recomendaria o que é especial com o dataframe e que operação estatística você pode fazer com ele?
LWZ de
3
dataframe pode conter mais de um tipo de dados, por exemplo, cada coluna pode ser uma lista, e você pode tratar cada lista individualmente aplicando algumas funções nelas e falando sobre operações estatísticas, como ter a média, desvio padrão, quartil,. ..
mazlor
Obrigado! Isso é realmente muito útil para mim. Sempre carrego o arquivo csv com o módulo csv, que me dá uma lista de listas. Este data.frame soa muito melhor!
LWZ
@LWZ: veja minhas edições e link, lmk se isso responde de forma sucinta às suas perguntas. Isso é tudo que podemos fazer aqui para 'vender' o pacote de benefícios. A questão mais ampla "Quais são os benefícios de usar um dataframe do pandas em vez de array / lista de lista simples do Python?" tem muitos benefícios, muitos para listar aqui ...
smci

Respostas:

166

pandas para o resgate:

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

Isso retorna o DataFrame do pandas que é semelhante a R's.

raiz
fonte
13

Para ler um arquivo CSV como um DataFrame do pandas, você precisará usar pd.read_csv .

Mas não é aqui que a história termina; os dados existem em muitos formatos diferentes e são armazenados de maneiras diferentes, então você frequentemente precisará passar parâmetros adicionais pararead_csv para garantir que seus dados sejam lidos corretamente.

Aqui está uma tabela que lista cenários comuns encontrados com arquivos CSV, juntamente com o argumento apropriado que você precisará usar. Normalmente, você precisará de todos ou de alguma combinação dos argumentos abaixo para ler seus dados.

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  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=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

Notas de rodapé

  1. Por padrão, read_csvusa um mecanismo analisador C para desempenho. O analisador C só pode lidar com separadores de caractere único. Se o seu CSV tiver um separador de vários caracteres, você precisará modificar seu código para usar o 'python'mecanismo. Você também pode passar expressões regulares:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorocorre quando os dados foram armazenados em um formato de codificação, mas lidos em um formato diferente e incompatível. Os esquemas de codificação mais comuns são 'utf-8'e 'latin-1'seus dados provavelmente se encaixarão em um desses.

  3. header=Falseespecifica que a primeira linha no CSV é uma linha de dados em vez de uma linha de cabeçalho e names=[...]permite que você especifique uma lista de nomes de coluna a serem atribuídos ao DataFrame quando ele for criado.

  4. "Sem nome: 0" ocorre quando um DataFrame com um índice sem nome é salvo em CSV e relido depois. Em vez de corrigir o problema durante a leitura, você também pode corrigir o problema ao escrever usando

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

Existem outros argumentos que não mencionei aqui, mas esses são os que você encontrará com mais frequência.

cs95
fonte
1
Você pode colar / reformatar a tabela como imagem como texto Unicode usando, por exemplo, ozh.github.io/ascii-tables ? Caso contrário, é difícil de ler e não será indexado para pesquisa de conteúdo, ou localizável com a pesquisa de texto Ctrl-F simples e antiga.
smci
@smci Concordo com o que você disse sobre indexação (além do fato de que as imagens não podem ser editadas por outras pessoas), mas não parece tão bom e requer rolagem, o que torna difícil seguir.
cs95
de qualquer maneira, você precisa reescrevê-lo para ser amigável para um novo usuário; em vez de coisas incompreensíveis como 'Avoid "Sem nome: 0"' deve dizer algo em inglês simples como ' index_col: diga aos pandas quais colunas usar como índice para o seu dataframe'
smci
@smci Parece que as tabelas ASCII não funcionam bem com sobrescritos - isso bagunça a formatação da tabela.
cs95
cs95: Recomendei Unicode, não ASCII. Unicode funciona bem. Portanto, basta alterar o padrão no menu suspenso em ozh.github.io/ascii-tables
smci
10

Aqui está uma alternativa para a biblioteca pandas usando o módulo csv integrado do 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

irá imprimir

{'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']}
Sidi
fonte
6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Isso importará seu arquivo .txt ou .csv para um DataFrame.

Rishabh
fonte
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
chahat
fonte
0

Você pode usar o módulo csv encontrado na biblioteca padrão do python para manipular arquivos CSV.

exemplo:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMetal
fonte
-0. Vindo de R, mazlor não estaria procurando pelo csvmódulo, pois é de nível muito baixo. pandasfornece o nível de abstração solicitado.
Steven Rumbalski
... além disso, ele lê os dados em um objeto Python útil, como um array numpy ...
Paul Hiemstra
0

importar pandas como
conjunto de dados pd = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')

ns_piumal
fonte
-1

Observe igualmente limpo, mas:

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

Não é tão compacto, mas faz o trabalho:

   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
Lee-Man
fonte
1
Isso não responde à pergunta do OP, pois não lê os dados csv em um objeto Python.
Paul Hiemstra
talvez substituir o num por enumerate no loop for?
LWZ de
@PaulHiemstra, OP não mencionou "objeto", mas pediu tranquilidade. Ainda assim, eu suspeito que a abordagem dos "pandas" se ajusta melhor ao que estava sendo solicitado.
Lee-Man