Pandas (IV)

Antes de nada, el contexto, para esta serie de entradas se va a usar lo siguiente:

 
Y sin más preámbulos seguimos con esta cuarta parte de la serie.
Concatenando datos
Para concatenar ficheros se usa la función pd.concat (documentación oficial]. Un ejemplo rápido sería el siguiente:
[code language=”Python”]
datos1 = pd.DataFrame(np.random.randn(5,3))
datos2 = pd.DataFrame(np.random.randn(5,3))
piezas = [datos1, datos2]
datos_concatenados_a = pd.concat(piezas)
print(‘datos1n {}’.format(datos1))
print(‘datos2n {}’.format(datos2))
print(‘datos_concatenadosn {}’.format(datos_concatenados_a))
[/code]
Cuyo resultado sería:

Interesante, rápido y limpio, como me gusta. Pero, si nos fijamos, tenemos un problema con los índices ya que algunos están repetidos. Si accedemos al índice 0, por ejemplo, obtendríamos dos filas de valores en lugar de una.
[code language=”Python”]
datos_concatenados_a.ix[0]
[/code]

Lo anterior podría llevar a equívocos. Esto lo podemos solventar de varias formas. Una sería reescribiendo la columna de índices para que no haya malentendidos al hacer cualquier operación. Por ejemplo:
[code language=”Python”]
datos_concatenados_aa = datos_concatenados_a
datos_concatenados_aa.index = range(datos_concatenados_aa.shape[0])
print(‘datos_concatenadosn {}’.format(datos_concatenados_aa))
[/code]

O usando la palabra clave ignore_index pasándole el valor True al crear la concatenación. Por ejemplo:
[code language=”Python”]
datos_concatenados_aa = pd.concat(piezas, ignore_index = True)
print(datos_concatenados_aa)
[/code]

Vale, hemos solventado el anterior problema pero que pasa si, por la razón que sea, nos interesase conservar los índices originales. Podríamos usar palabras clave para cada ‘cosa’ concatenada en el DataFrame final. Ejemplo:
[code language=”Python”]
#datos1 = pd.DataFrame(np.random.randn(5,3))
#datos2 = pd.DataFrame(np.random.randn(5,3))
#piezas = [datos1, datos2]
datos_concatenados_b = pd.concat(piezas, keys = [‘datos1’, ‘datos2’])
print(‘datos1n {}’.format(datos1))
print(‘datos2n {}’.format(datos2))
print(‘datos_concatenadosn {}’.format(datos_concatenados_b))
[/code]

Vemos que hay índices repetidos pero están en ‘grupos’ diferentes. De esta forma, si queremos acceder a la fila con índice 0 del primer grupo de datos concatenados (datos1) podemos hacer lo siguiente:
[code language=”Python”]
print(datos_concatenados_b.ix[‘datos1’].ix[0])
<pre>0   -1.691985
1   -1.181241
2   -0.714437
Name: 0, dtype: float64</pre>
Estamos viendo filas, pero podemos hacer los mismo para las columnas, por supuesto, usando el nombre de la columna (en el ejemplo siguiente, la columna 0):
[code language="Python"]
print(datos_concatenados_b.ix[‘datos1’][0])
[/code]

Vemos qué tipo de índice es este índice ‘compuesto’ que hemos creado:
[code language=”Python”]
datos_concatenados_b.index
[/code]

Vemos que es un MultiIndex. No vamos a ver mucho más pero os lo dejo anotado para que sepáis que existen combinaciones de índices (o de columnas) y se manejan de forma un poco más compleja que un índice ‘simple’. Se conoce como indexación jerárquica y permiten ser un poco más descriptivos (verbose) con nuestros DataFrames aunque conlleva un punto más de complejidad a la hora de trabajar con los datos.
¿Qué pasa cuando una de las columnas no es igual en los grupos de datos que queramos concatenar? El nuevo DataFrame tendrá en cuenta este aspecto rellenando con NaNs donde convenga. Veamos el siguiente código de ejemplo:
[code language=”Python”]
datos1 = pd.DataFrame(np.random.randn(5,3))
datos2 = pd.DataFrame(np.random.randn(5,4))
piezas = [datos1, datos2]
datos_concatenados_c = pd.concat(piezas, ignore_index = True)
print(‘datos1n {}’.format(datos1))
print(‘datos2n {}’.format(datos2))
print(‘datos_concatenadosn {}’.format(datos_concatenados_c))
[/code]

Vemos que el primer grupo de datos, datos1, solo tiene tres columnas mientras que el segundo grupo, datos2, tiene 4 columnas. El resultado final tendrá en cuenta esto y rellenerá la columna 3 que pertenece a los datos del primer grupo de datos, datos1. Cool!
Lo visto hasta ahora para concatenar Series o DataFrames lo podemos hacer también usando el método append. Veamos un ejemplo similar a lo anterior:
[code language=”Python”]
datos1 = pd.DataFrame(np.random.randn(5,3))
datos2 = pd.DataFrame(np.random.randn(5,4))
datos_concatenados_d = datos1.append(datos2, ignore_index = True)
print(‘datos1n {}’.format(datos1))
print(‘datos2n {}’.format(datos2))
print(‘datos_concatenadosn {}’.format(datos_concatenados_d))
[/code]

Otra vez hemos llegado al final. ¡¡Estad atentos a la próxima entrega!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

six + = seven