Organizar datos con pandas I
junio 18, 2015Organizar datos con pandas I¶
In [1]:
import pandas as pd
import numpy as np
Multi-índice en dataframe¶
Crear un dataframe con multi-índice¶
Los dataframes pueden tener varios índices y varios nombres de columna, para esto se usa la clase de pandas MultiIndex. Estos se pueden crear a partir de una lista de tuplas, con el método drom_tuples, donde cada tupla contiene los nombres de cada columna o a partir de una combinación entre varias tuplas con el método from_product
In [2]:
columns = pd.MultiIndex.from_tuples([('A', 'positivo'), ('B', 'positivo'),
('A', 'negativo'), ('B', 'negativo'),
('O', 'positivo')],
names=['tipo', 'Rh'])
index = pd.MultiIndex.from_product([('menor', 'adulto'),('hombre', 'mujer')],
names=['edad', 'sexo'])
df = pd.DataFrame(np.random.randn(4,5), columns=columns, index=index)
df
Out[2]:
Obtener información de un dataframe multi-índex¶
Columnas¶
Para obtener la información de una columna se usa el formato corriente, dataframe[nombre_col], siempre y cuando el nombre de la columna pertenezca a una columna de primer nivel, es decir, la primera fila de nombres de columnas.
In [3]:
df['A']
Out[3]:
Para obtener información de las columnas de otros niveles, se debe referir primero la columna de primer nivel y luego a las de los niveles siguientes, en órden jerárquico.
In [4]:
df['B', 'positivo']
Out[4]:
Filas¶
In [5]:
df.loc['adulto']
Out[5]:
In [6]:
df.loc['adulto', 'mujer']
Out[6]:
Por posición:
In [7]:
df.iloc[0]
Out[7]:
In [8]:
df.iloc[0, 1]
Out[8]:
Slice (seleccionar secciones del dataframe)¶
In [9]:
df
Out[9]:
In [10]:
df.iloc[1:3]
Out[10]:
General¶
Para obtener información sea de filas o columnas de cualquier nivel se usa el método xs. Se especifica el nombre de la columna y el nombre del nivel al que pertenece, para buscar por columna se agrega axis=1.
In [11]:
df.xs('mujer', level='sexo')
Out[11]:
In [12]:
df.xs('negativo', level='Rh', axis=1)
Out[12]:
Si se quiere mantener la información de los otros niveles a los que pertenece esta información se usa el argumento drop_level=False
In [13]:
df.xs('negativo', level='Rh', axis=1 , drop_level=False)
Out[13]:
Stack¶
El método stack permite reordenar los datos que tienen iguales atributos con igual nombre de columna en el dataframe. Por ejemplo si se tienen algún tipo de resultados para varios tipos de sangre, los tipos pueden ser diferentes pero pueden compartir el Rh, ese sería un atributo en común. También es uno de los métodos para manipular dataframe con varios nombres de columna.
In [14]:
# Si no se le indica los nombres de columna que convertirá en índice este
# toma el último nivel de columna en este caso "tipo" es el primer nivel
# y "Rh" el segundo.
df.stack()
Out[14]:
In [15]:
df.stack('tipo')
Out[15]:
In [16]:
# Se convierten los dos nombres de columna a índice tomando como principal a "tipo" y
# "Rh" como una clasificación interna de este.
df_st = df.stack(level=['tipo','Rh'])
df_st
Out[16]:
In [17]:
# Ahora "tipo" como una clasificación interna de "Rh"
df.stack(level=['Rh','tipo'])
Out[17]:
0 comments