pandas                
            Indexación y selección de datos.
        
        
            
    Buscar..
Seleccionar columna por etiqueta
# Create a sample DF
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
# Show DF
df
          A         B         C
0 -0.467542  0.469146 -0.861848
1 -0.823205 -0.167087 -0.759942
2 -1.508202  1.361894 -0.166701
3  0.394143 -0.287349 -0.978102
4 -0.160431  1.054736 -0.785250
# Select column using a single label, 'A'
df['A']
0   -0.467542
1   -0.823205
2   -1.508202
3    0.394143
4   -0.160431
# Select multiple columns using an array of labels, ['A', 'C']
df[['A', 'C']]
          A         C
0 -0.467542 -0.861848
1 -0.823205 -0.759942
2 -1.508202 -0.166701
3  0.394143 -0.978102
4 -0.160431 -0.785250
 Detalles adicionales en: http://pandas.pydata.org/pandas-docs/version/0.18.0/indexing.html#selection-by-label
Seleccionar por posición
 El iloc (abreviatura de ubicación de enteros ) permite seleccionar las filas de un marco de datos según su índice de posición. De esta manera, se pueden dividir los marcos de datos como se hace con la división de la lista de Python. 
df = pd.DataFrame([[11, 22], [33, 44], [55, 66]], index=list("abc"))
df
# Out:
#     0   1
# a  11  22
# b  33  44
# c  55  66
df.iloc[0]  # the 0th index (row)
# Out:
# 0    11
# 1    22
# Name: a, dtype: int64
df.iloc[1]  # the 1st index (row)
# Out:
# 0    33
# 1    44
# Name: b, dtype: int64
df.iloc[:2] # the first 2 rows
#     0   1
# a  11  22
# b  33  44
df[::-1]    # reverse order of rows
#     0   1
# c  55  66
# b  33  44
# a  11  22
 La ubicación de la fila se puede combinar con la ubicación de la columna
df.iloc[:, 1]  # the 1st column
# Out[15]:
# a    22
# b    44
# c    66
# Name: 1, dtype: int64
 Ver también: Selección por Posición.
Rebanar con etiquetas
Cuando se usan etiquetas, tanto el inicio como la parada se incluyen en los resultados.
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(5, 5)), columns = list("ABCDE"), 
                  index = ["R" + str(i) for i in range(5)])
# Out: 
#      A   B   C   D   E
# R0  99  78  61  16  73
# R1   8  62  27  30  80
# R2   7  76  15  53  80
# R3  27  44  77  75  65
# R4  47  30  84  86  18
  Filas R0 a R2 : 
df.loc['R0':'R2']
# Out: 
#      A   B   C   D   E
# R0   9  41  62   1  82
# R1  16  78   5  58   0
# R2  80   4  36  51  27
  Observe cómo loc diferencia de iloc porque iloc excluye el índice final 
df.loc['R0':'R2'] # rows labelled R0, R1, R2
# Out: 
#      A   B   C   D   E
# R0   9  41  62   1  82
# R1  16  78   5  58   0
# R2  80   4  36  51  27
# df.iloc[0:2] # rows indexed by 0, 1
#      A   B   C   D   E
# R0  99  78  61  16  73
# R1   8  62  27  30  80
  Columnas C a E : 
df.loc[:, 'C':'E']
# Out: 
#      C   D   E
# R0  62   1  82
# R1   5  58   0
# R2  36  51  27
# R3  68  38  83
# R4   7  30  62
        Posición mixta y selección basada en etiqueta
Marco de datos:
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(5, 5)), columns = list("ABCDE"), 
                  index = ["R" + str(i) for i in range(5)])
df
Out[12]: 
     A   B   C   D   E
R0  99  78  61  16  73
R1   8  62  27  30  80
R2   7  76  15  53  80
R3  27  44  77  75  65
R4  47  30  84  86  18
 Seleccione filas por posición y columnas por etiqueta:
df.ix[1:3, 'C':'E']
Out[19]: 
     C   D   E
R1   5  58   0
R2  36  51  27
  Si el índice es entero, .ix utilizará etiquetas en lugar de posiciones: 
df.index = np.arange(5, 10)
df
Out[22]: 
    A   B   C   D   E
5   9  41  62   1  82
6  16  78   5  58   0
7  80   4  36  51  27
8  31   2  68  38  83
9  19  18   7  30  62
#same call returns an empty DataFrame because now the index is integer
df.ix[1:3, 'C':'E']
Out[24]: 
Empty DataFrame
Columns: [C, D, E]
Index: []
        Indexación booleana
Uno puede seleccionar filas y columnas de un marco de datos utilizando matrices booleanas.
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(5, 5)), columns = list("ABCDE"), 
                  index = ["R" + str(i) for i in range(5)])
print (df)
#      A   B   C   D   E
# R0  99  78  61  16  73
# R1   8  62  27  30  80
# R2   7  76  15  53  80
# R3  27  44  77  75  65
# R4  47  30  84  86  18
 mask = df['A'] > 10
print (mask)
# R0     True
# R1    False
# R2    False
# R3     True
# R4     True
# Name: A, dtype: bool
print (df[mask])
#      A   B   C   D   E
# R0  99  78  61  16  73
# R3  27  44  77  75  65
# R4  47  30  84  86  18
print (df.ix[mask, 'C'])
# R0    61
# R3    77
# R4    84
# Name: C, dtype: int32
print(df.ix[mask, ['C', 'D']])
#      C   D
# R0  61  16
# R3  77  75
# R4  84  86
 Más en la documentación de los pandas .
Filtrado de columnas (selección de "interesante", eliminación innecesaria, uso de RegEx, etc.)
generar muestra DF
In [39]: df = pd.DataFrame(np.random.randint(0, 10, size=(5, 6)), columns=['a10','a20','a25','b','c','d'])
In [40]: df
Out[40]:
   a10  a20  a25  b  c  d
0    2    3    7  5  4  7
1    3    1    5  7  2  6
2    7    4    9  0  8  7
3    5    8    8  9  6  8
4    8    1    0  4  4  9
 mostrar columnas que contengan la letra 'a'
In [41]: df.filter(like='a')
Out[41]:
   a10  a20  a25
0    2    3    7
1    3    1    5
2    7    4    9
3    5    8    8
4    8    1    0
  muestre las columnas usando el filtro RegEx (b|c|d) - b o c o d : 
In [42]: df.filter(regex='(b|c|d)')
Out[42]:
   b  c  d
0  5  4  7
1  7  2  6
2  0  8  7
3  9  6  8
4  4  4  9
  mostrar todas las columnas excepto los que empiezan por a (en otras palabras remove / dejar todas las columnas satisfacer RegEx dado) 
In [43]: df.ix[:, ~df.columns.str.contains('^a')]
Out[43]:
   b  c  d
0  5  4  7
1  7  2  6
2  0  8  7
3  9  6  8
4  4  4  9
        Filtrar / seleccionar filas usando el método `.query ()`
import pandas as pd
 generar DF aleatorio
df = pd.DataFrame(np.random.randint(0,10,size=(10, 3)), columns=list('ABC'))
In [16]: print(df)
   A  B  C
0  4  1  4
1  0  2  0
2  7  8  8
3  2  1  9
4  7  3  8
5  4  0  7
6  1  5  5
7  6  7  8
8  6  7  3
9  6  4  5
  seleccione las filas donde los valores en la columna A > 2 y los valores en la columna B < 5 
In [18]: df.query('A > 2 and B < 5')
Out[18]:
   A  B  C
0  4  1  4
4  7  3  8
5  4  0  7
9  6  4  5
  utilizando el método .query() con variables para filtrar 
In [23]: B_filter = [1,7]
In [24]: df.query('B == @B_filter')
Out[24]:
   A  B  C
0  4  1  4
3  2  1  9
7  6  7  8
8  6  7  3
In [25]: df.query('@B_filter in B')
Out[25]:
   A  B  C
0  4  1  4
        Rebanado Dependiente del Camino
Puede ser necesario atravesar los elementos de una serie o las filas de un marco de datos de manera que el siguiente elemento o la siguiente fila dependa del elemento o fila previamente seleccionado. Esto se llama dependencia de ruta.
 Considere las siguientes series de tiempo s con frecuencia irregular. 
#starting python community conventions
import numpy    as np
import pandas   as pd
# n is number of observations
n = 5000
day = pd.to_datetime(['2013-02-06'])
# irregular seconds spanning 28800 seconds (8 hours)
seconds = np.random.rand(n) * 28800 * pd.Timedelta(1, 's')
# start at 8 am
start = pd.offsets.Hour(8)
# irregular timeseries
tidx = day + start + seconds
tidx = tidx.sort_values()
s = pd.Series(np.random.randn(n), tidx, name='A').cumsum()
s.plot();
  Asumamos una condición dependiente del camino. Comenzando con el primer miembro de la serie, quiero tomar cada elemento subsiguiente de manera que la diferencia absoluta entre ese elemento y el elemento actual sea mayor o igual que x . 
Vamos a resolver este problema utilizando generadores de pitón.
Función generadora
def mover(s, move_size=10):
    """Given a reference, find next value with
    an absolute difference >= move_size"""
    ref = None
    for i, v in s.iteritems():
        if ref is None or (abs(ref - v) >= move_size):
            yield i, v
            ref = v
  Entonces podemos definir una nueva serie de moves como tal. 
moves = pd.Series({i:v for i, v in mover(s, move_size=10)},
                  name='_{}_'.format(s.name))
 Trazando ambos
moves.plot(legend=True)
s.plot(legend=True)
 El análogo para los marcos de datos sería:
def mover_df(df, col, move_size=2):
    ref = None
    for i, row in df.iterrows():
        if ref is None or (abs(ref - row.loc[col]) >= move_size):
            yield row
            ref = row.loc[col]
df = s.to_frame()
moves_df = pd.concat(mover_df(df, 'A', 10), axis=1).T
moves_df.A.plot(label='_A_', legend=True)
df.A.plot(legend=True)
         Obtener las primeras / últimas n filas de un marco de datos
 Para ver los primeros o últimos registros de un marco de datos, puede usar los métodos head y tail 
 Para devolver las primeras n filas, use DataFrame.head([n]) 
df.head(n)
  Para devolver las últimas n filas, use DataFrame.tail([n]) 
df.tail(n)
 Sin el argumento n, estas funciones devuelven 5 filas.
 Tenga en cuenta que la notación de corte para head / tail sería: 
df[:10]  # same as df.head(10)
df[-10:] # same as df.tail(10)
        Seleccionar filas distintas en el marco de datos
Dejar
df = pd.DataFrame({'col_1':['A','B','A','B','C'], 'col_2':[3,4,3,5,6]})
df
# Output:
#   col_1  col_2
# 0     A      3
# 1     B      4
# 2     A      3
# 3     B      5
# 4     C      6
  Para obtener los valores distintos en col_1 puede usar Series.unique() 
df['col_1'].unique()
# Output:
# array(['A', 'B', 'C'], dtype=object)
 Pero Series.unique () solo funciona para una sola columna.
 Para simular el col_1 único seleccionado, col_2 de SQL, puede usar DataFrame.drop_duplicates() : 
df.drop_duplicates()
#   col_1  col_2
# 0     A      3
# 1     B      4
# 3     B      5
# 4     C      6
 Esto te dará todas las filas únicas en el marco de datos. Así que si
df = pd.DataFrame({'col_1':['A','B','A','B','C'], 'col_2':[3,4,3,5,6], 'col_3':[0,0.1,0.2,0.3,0.4]})
df
# Output:
#   col_1  col_2  col_3
# 0     A      3    0.0
# 1     B      4    0.1
# 2     A      3    0.2
# 3     B      5    0.3
# 4     C      6    0.4
df.drop_duplicates()
#   col_1  col_2  col_3
# 0     A      3    0.0
# 1     B      4    0.1
# 2     A      3    0.2
# 3     B      5    0.3
# 4     C      6    0.4
 Para especificar las columnas a considerar al seleccionar registros únicos, páselos como argumentos
df = pd.DataFrame({'col_1':['A','B','A','B','C'], 'col_2':[3,4,3,5,6], 'col_3':[0,0.1,0.2,0.3,0.4]})
df.drop_duplicates(['col_1','col_2'])
# Output:
#   col_1  col_2  col_3
# 0     A      3    0.0
# 1     B      4    0.1
# 3     B      5    0.3
# 4     C      6    0.4
# skip last column
# df.drop_duplicates(['col_1','col_2'])[['col_1','col_2']]
#   col_1  col_2
# 0     A      3
# 1     B      4
# 3     B      5
# 4     C      6
 Fuente: ¿Cómo "seleccionar distintas" en varias columnas de marcos de datos en pandas? .
Filtrar las filas con datos faltantes (NaN, Ninguno, NaT)
 Si tiene un marco de datos con datos faltantes ( NaN , pd.NaT , None ) puede filtrar filas incompletas 
df = pd.DataFrame([[0,1,2,3],
                  [None,5,None,pd.NaT],
                  [8,None,10,None],
                  [11,12,13,pd.NaT]],columns=list('ABCD'))
df
# Output:    
#     A   B   C     D
# 0   0   1   2     3
# 1 NaN   5 NaN   NaT
# 2   8 NaN  10  None
# 3  11  12  13   NaT
  DataFrame.dropna elimina todas las filas que contienen al menos un campo con datos faltantes 
df.dropna()
# Output:
#    A  B  C  D
# 0  0  1  2  3
  Para soltar las filas que faltan datos en las columnas especificadas, use el subset 
df.dropna(subset=['C'])
# Output:
#     A   B   C     D
# 0   0   1   2     3
# 2   8 NaN  10  None
# 3  11  12  13   NaT
  Use la opción inplace = True para el reemplazo en el lugar con el marco filtrado. 


