2011-12-24 6 views
7

Las comprensiones de la lista son muy buenas. Pero algún tipo de "... Únete ..." sería muy útil. Gracias. Entonces, por ejemplo. Tengo un Set A = {1,0}, una lista B = [[1,1,1], [2,3]]. Me gustaría encontrar todas las filas en B donde el segundo colomu es uno de los valores en A. O algo más general, tengo 2 archivos CSV. Quiero averiguar todas las filas en las que coinciden los valores de algún colono de los dos archivos. Simplemente como una especie de 'combinación' de dos archivos. Uno de los archivos es tamaño GB. sqldf is "SQL select on R data frames."¿Hay algún módulo en Python que haga algo como "sqldf" para R?

+3

Se podría conseguir más mejores respuestas/si usted tiene una breve resumen de lo que 'sqldf' hace para los usuarios que no son R. ¿Qué partes de su funcionalidad quieres exactamente? –

+1

De acuerdo ... También sería útil algún código o al menos algún pseudo código para explicar lo que estás tratando de hacer. –

Respuesta

4

estoy al tanto de una biblioteca haciendo lo que pide (pero sólo un vistazo a la documentación sqldf), sin embargo nada de lo que pidieron realmente requiere una biblioteca, que son de una sola línea en Python (y que podría por supuesto, abstrae la funcionalidad creando una función en lugar de una simple lista de comprensión ...)

Set A = {1,0}, una lista B = [[1,1,1], [2,3]] . Me gustaría encontrar todas las filas de B, donde la segunda columna es uno de los valores en A.

>>> a = set([1, 0]) 
>>> b = [[1,1],[2,3]] 
>>> [l for l in b if l[1] in a] 
[[1, 1]] 

Tengo 2 archivos CSV. Quiero averiguar todas las filas en las que coinciden los valores de alguna columna de los dos archivos.

>>> f1 = [[1, 2, 3], [4, 5, 6]] 
>>> f2 = [[0, 2, 8], [7, 7, 7]] 
>>> [tuple_ for tuple_ in zip(f1, f2) if tuple_[0][1] == tuple_[1][1]] 
[([1, 2, 3], [0, 2, 8])] 

EDIT: Si uso de memoria es un problema que debe usar generadores en lugar de las listas. Por ejemplo:

>>> zip(f1, f2) 
[([1, 2, 3], [0, 2, 8]), ([4, 5, 6], [7, 7, 7])] 

pero utilizando generadores:

>>> import itertools as it 
>>> gen = it.izip(f1, f2) 
>>> gen 
<itertools.izip object at 0x1f24ab8> 
>>> next(gen) 
([1, 2, 3], [0, 2, 8]) 
>>> next(gen) 
([4, 5, 6], [7, 7, 7]) 

Y para la fuente de datos:

>>> [line for line in f1] 
[[1, 2, 3], [4, 5, 6]] 

traducen como generador, como:

>>> gen = (line for line in f1) 
>>> gen 
<generator object <genexpr> at 0x1f159b0> 
>>> next(gen) 
[1, 2, 3] 
>>> next(gen) 
[4, 5, 6] 
+0

Gracias @mac. Tiene razón, la comprensión de la lista es similarmente poderosa como SQL, si no está tratando con los archivos grandes que no se pueden leer en la memoria una vez. Estaré muy feliz si hago lo mismo con los grandes archivos CSV. – gstar2002

+0

@ gstar2002: no hay nada que le impida usar esta sintaxis con generadores en lugar de listas. Ver ediciones. – mac

+0

gracias, funciona para izip. Pero para cosas como ([l1, l2] para l1 en f1 para l2 en f2), no funciona. Solo obtengo la primera línea de f1 combinada con todas las líneas de f2. Pero me gustaría tener todas las combinaciones. – gstar2002

Cuestiones relacionadas