Python: ¿Cómo hacer la manipulación de datos básica como en R?

Llevo varios años trabajando con R R es muy fuerte en la manipulación de datos. Estoy aprendiendo python y me gustaría saber cómo manipular los datos usando python. Básicamente, mis conjuntos de datos se organizan como marcos de datos (por ejemplo, hoja de Excel). Me gustaría saber (a modo de ejemplo) cómo se puede realizar este tipo de tareas básicas de manipulación de datos utilizando python.

1. Read csv file like the following var1, var2, var3 1, 2, 3 4, 5, 6 7, 8, 9 2. Subset data where var2 in ('5', '8') 3. Make a new variable --> var4 = var3 * 3 4. Transpose this data 5. Write to csv file 

¡Su ayuda y ejemplo son los más apreciados!

 import csv from itertools import izip with open('source.csv') as f: reader = csv.reader(f) # filter data data = (row for row in reader if row[1].strip() in ('5', '8')) # make a new variable data = (row + [int(row[2]) * 3] for row in data) # transpose data data = izip(*data) # write data to a new csv file with open('destination.csv', 'w') as fw: csv.writer(fw).writerows(data) 

No estoy de acuerdo con el comentario de Cpfohl, tal vez porque yo mismo he pasado por esta misma transición, y no es obvio cómo un usuario ingenuo podría formular el problema de manera más precisa. Actualmente, en realidad es un problema de desarrollo activo con una serie de proyectos que han surgido con una funcionalidad que no se solapa (por ejemplo, en el mundo de la serie económica, en el mundo de la imagen cerebral, etc.).

La respuesta corta es que las diversas bibliotecas de python para tratar tablas y archivos csv no son tan buenas para un principiante como las de R, que son el resultado final de muchos años de usuarios de distintos niveles.

En primer lugar, echa un vistazo a recarrays en numpy. Esta es probablemente la estructura de datos más cercana que se encuentra en una biblioteca de uso común que es similar a un data.frame en R. En particular, probablemente le gustará la función numpy.recfromcsv, aunque no es tan robusta como, por ejemplo, read.csv en R (tendrá problemas con finales de línea no estándar, por ejemplo).

Subconfigurar un recarray es fácil (aunque crearlo puede parecer torpe):

 import numpy as np mydata = np.array([(1.0, 2), (3.0, 4)], dtype=[('x', float), ('y', int)]) mydata = mydata.view(np.recarray) mydata[mydata.x > 2] 

La modificación de la naturaleza de una matriz numpy no suele ser tan fácil como en R, pero hay una buena biblioteca de funciones en numpy.lib.recfunctions (que se deben importar por separado, no viene con un simple número de import numpy ). En particular, echa un vistazo a rec_append_fields y rec_join para agregar columnas.

Numpy tiene una función numpy.savetxt que aceptará un argumento delimitador simple para crear un archivo csv, pero no imprimirá los nombres de las columnas con tristeza (al menos, no veo que lo haga). Por lo tanto, aunque no deseo agregar bibliotecas innecesarias (ya que proporciona un código menos portátil), es posible que solo use matplotlib.mlab.rec2csv (también encontrará otras funciones similares en ese vecindario: la comunidad numpy está tratando de portar, generalmente útil código numérico / manipulación de datos para numpy propiamente. Quién sabe, tal vez usted hará esto?).

Notarás que no respondí (4), porque eso no tiene sentido. Las tablas no se transponen en python o R. Las matrices o matrices lo hacen. Entonces, convierta sus datos a una matriz con un tipo de dty uniforme, luego solo use myarray.T.

Otras herramientas que puede consultar son pytables (y el paquete relacionado con carray), larry, datarray, pandas y tabular. En particular, datarray está buscando crear un sistema para matrices de datos etiquetados que sirva de base para otros proyectos (y creo que también tiene desarrolladores de los proyectos larry y pandas).

¡Espero que ayude! Dav

Respuesta simple: usar pandas.

1

 In [2]: df = read_csv('foo.csv', index_col=None) In [3]: df Out[3]: var1 var2 var3 0 1 2 3 1 4 5 6 2 7 8 9 

2

 In [4]: df[df['var2'].isin([5, 8])] Out[4]: var1 var2 var3 1 4 5 6 2 7 8 9 

3

 In [5]: df['var4'] = df['var3'] * 2 In [6]: df Out[6]: var1 var2 var3 var4 0 1 2 3 6 1 4 5 6 12 2 7 8 9 18 

4

 In [7]: df.T Out[7]: 0 1 2 var1 1 4 7 var2 2 5 8 var3 3 6 9 var4 6 12 18 

6

 In [8]: df.to_csv('foo2.csv') In [9]: !cat foo2.csv index,var1,var2,var3,var4 0,1,2,3,6 1,4,5,6,12 2,7,8,9,18 

Hay un módulo para el análisis de CSV en la biblioteca estándar. Para obtener una lista de las filas que contienen una lista de las celdas, puede usar list(csv.reader(...)) .

Los pasos 2 y 3 se pueden escribir en una lista de comprensión: [(var1, var2, var3, var3 * 3) for var1, var2, var3 in data if var2 in ('5', '8')] .

No tengo conocimiento de nada en la biblioteca estándar para la transposición de listas de listas. Tal vez NumPy o SciPy tenga algo. Una forma rápida y sucia sería comprimir las filas ( zip(*lists) ).

Escribir de nuevo en el archivo debe ser tan simple como construir como csv.writer y pasarlo cada fila en un bucle.