Importar archivo CSV como un DataFrame de pandas

91

¿Cuál es la forma de Python para leer un archivo CSV en un DataFrame de pandas (que luego puedo usar para operaciones estadísticas, puede tener columnas de tipos diferentes, etc.)?

Mi archivo CSV "value.txt"tiene el siguiente contenido:

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

En R leeríamos este archivo usando:

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

y eso devolvería 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

¿Existe una forma Pythonic de obtener la misma funcionalidad?

mazlor
fuente
¿Recomendaría qué tiene de especial el marco de datos y qué operación estadística puede hacer con él?
LWZ
3
El marco de datos puede contener más de un tipo de datos, por ejemplo, cada columna puede ser una lista, y puede tratar cada lista individualmente aplicando algunas funciones en ellas y hablando de operaciones estadísticas, como tener la media, la desviación estándar, el cuartil,. ..
mazlor
¡Gracias! En realidad, esto me resulta muy útil. Siempre he cargado un archivo csv con el módulo csv que me da una lista de listas. ¡Este data.frame suena mucho mejor!
LWZ
@LWZ: vea mis ediciones y el enlace, vea si eso responde sucintamente a sus preguntas. Eso es todo lo que podemos hacer aquí para "vender" el paquete de beneficios. La pregunta más amplia "¿Cuáles son los beneficios de usar un marco de datos pandas sobre una matriz / lista de lista de Python simple?" tiene muchos beneficios, demasiados para enumerarlos aquí ...
smci

Respuestas:

160

pandas al rescate:

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

Esto devuelve pandas DataFrame que es similar a R's.

raíz
fuente
10

Para leer un archivo CSV como un DataFrame de pandas, necesitará usar pd.read_csv.

Pero aquí no es donde termina la historia; Los datos existen en muchos formatos diferentes y se almacenan de diferentes maneras, por lo que a menudo necesitará pasar parámetros adicionales read_csvpara asegurarse de que sus datos se lean correctamente.

Aquí hay una tabla que enumera los escenarios comunes encontrados con los archivos CSV junto con el argumento apropiado que necesitará usar. Por lo general, necesitará todos o una combinación de los siguientes argumentos para leer sus datos.

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  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 al pie

  1. De forma predeterminada, read_csvutiliza un motor analizador C para el rendimiento. El analizador C solo puede manejar separadores de un solo carácter. Si su CSV tiene un separador de varios caracteres, deberá modificar su código para usar el 'python'motor. También puede pasar expresiones regulares:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorocurre cuando los datos se almacenaron en un formato de codificación pero se leyeron en otro diferente e incompatible. Los esquemas de codificación más comunes son 'utf-8'y 'latin-1', es probable que sus datos encajen en uno de estos.

  3. header=Falseespecifica que la primera fila en el CSV es una fila de datos en lugar de una fila de encabezado, y le names=[...]permite especificar una lista de nombres de columna para asignar al DataFrame cuando se crea.

  4. "Sin nombre: 0" ocurre cuando un DataFrame con un índice sin nombre se guarda en CSV y luego se vuelve a leer. En lugar de tener que solucionar el problema mientras lee, también puede solucionarlo al escribir utilizando

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

Hay otros argumentos que no he mencionado aquí, pero estos son los que encontrará con más frecuencia.

cs95
fuente
1
¿Puede volver a pegar / reformatear la tabla como imagen como texto Unicode usando, por ejemplo, ozh.github.io/ascii-tables ? De lo contrario, es difícil de leer y no se indexará para la búsqueda de contenido ni se podrá encontrar con la vieja búsqueda de texto Ctrl-F.
smci
@smci Estoy de acuerdo con lo que dijo sobre la indexación (más el hecho de que otras personas no pueden editar las imágenes) pero no se ve tan bien y requiere desplazamiento, lo que dificulta su seguimiento.
cs95
de todos modos, debe reescribirlo para que sea fácil de usar para un nuevo usuario; en lugar de cosas incomprensibles como 'Evita 'Sin nombre: 0'' debe decir algo sencillo como Inglés ' index_col: pandas decir cuál (s) columna de usar como los indices de su trama de datos'
SMCI
@smci Parece que las tablas ASCII no funcionan bien con superíndices; estropea el formato de la tabla.
cs95
cs95: recomendé Unicode, no ASCII. Unicode funciona bien. Así que simplemente cambie el valor predeterminado en el menú
smci
9

Aquí hay una alternativa a la biblioteca pandas usando el módulo csv incorporado de 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

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

Esto importará su archivo .txt o .csv a un DataFrame.

Rishabh
fuente
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
fuente
0

Puedes usar el módulo csv encuentra en la biblioteca estándar de Python para manipular archivos CSV.

ejemplo:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMetal
fuente
-0. Viniendo de R, mazlor no estaría buscando el csvmódulo ya que es de un nivel demasiado bajo. pandasproporciona el nivel de abstracción solicitado.
Steven Rumbalski
... además, lee los datos en un objeto Python útil, como una matriz numpy ...
Paul Hiemstra
0

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

ns_piumal
fuente
-1

Tenga en cuenta que es igual de limpio, pero:

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

No tan compacto, pero hace el trabajo:

   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
fuente
1
Esto no responde a la pregunta del OP, ya que no lee los datos csv en un objeto Python.
Paul Hiemstra
tal vez reemplazar el num con enumerate en el bucle for?
LWZ
@PaulHiemstra, OP no mencionó "objeto", pero pidió facilidad. Aún así, sospecho que el enfoque de "pandas" se adapta mejor a lo que se pide.
Lee-Man