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 tercera parte de la serie.
Trabajando con datos, indexación, selección,…
¿Cómo podemos seleccionar, añadir, eliminar, mover,…, columnas, filas,…?
Para seleccionar una columna solo hemos de usar el nombre de la columna y pasarlo como si fuera un diccionario (o un atributo).
Para añadir una columna simplemente hemos de usar un nombre de columna no existente y pasarle los valores para esa columna.
Para eliminar una columna podemos usar del o el método pop del DataFrame.
Para mover una columna podemos usar una combinación de las metodologías anteriores.
Por ejemplo, vemos a seleccionar los valores de una columna:
[code language=”Python”]
df = pd.DataFrame(np.random.randn(5,3),
index = [‘primero’,’segundo’,’tercero’,’cuarto’,’quinto’],
columns = [‘velocidad’, ‘temperatura’,’presion’])
print(df[‘velocidad’])
print(df.velocidad)
[/code]
Hemos creado un DataFrame y para acceder a la columna velocidad lo podemos hacer de dos formas. O bien usando el nombre de la columna como si fuera una clave de un diccionario o bien usando el nombre de la columna como si fuera un atributo. En el caso de que los nombres de las columnas sean números, la segunda opción no podríais usarla…
Vamos a añadir una columna nueva al DataFrame. Es algo tan sencillo como usar un nombre de columna no existente y pasarle los datos:
[code language=”Python”]
df[‘velocidad_maxima’] = np.random.randn(df.shape[0])
print(df)
[/code]
Y el resultado sería:

 
Pero qué pasa si quiero añadir la columna en un lugar específico. Para ello podemos usar el método insert (y de paso vemos como podemos borrar una columna):
[code language=”Python”]
# forma 1 (borramos la columna ‘velocidad_maxima’ que está al final del df usando del)
# (Colocamos la columna eliminada en la posición que especifiquemos)
print(df)
columna = df[‘velocidad_maxima’]
del df[‘velocidad_maxima’]
print(df)
print(columna)
df.insert(1, ‘velocidad_maxima’, columna)
print(df)
[/code]
El resultado del DataFrame paso a paso sería:

 
Una forma alternativa sería usando el método pop:
[code language=”Python”]
# forma 2 (borramos usando el método pop y añadimos la columna borrada en la última posición de nuevo)
print(df)
columna = df.pop(‘velocidad_maxima’)
print(df)
print(columna)
df.insert(3, ‘velocidad_maxima’, columna)
print(df)
[/code]
Cuyo resultado, paso a paso sería:

 
Para seleccionar datos concretos de un DataFrame podemos usar el índice, una rebanada, valores booleanos, la columna,…
[code language=”Python”]
print(‘Seleccionamos la columna de velocidades’)
print(df[‘velocidad’])
[/code]

[code language=”Python”]
print(‘Seleccionamos todas las columnas cuyo índice es igual a tercero’)
print(df.xs(‘tercero’))
[/code]

[code language=”Python”]
print(‘Seleccionamos todas las columnas cuyo índice está entre tercero y quinto’)
print(‘Daos cuenta que en este caso los índices son inclusivos’)
print(df.ix[‘tercero’:’quinto’])
[/code]

[code language=”Python”]
print(‘Seleccionamos todos los valores de velocidad donde la temperatura > 0’)
print(df[df[‘temperatura’ > 0][‘velocidad’])
[/code]

[code language=”Python”]
print(‘Seleccionamos todos los valores de una columna por índice usando una’)
print(‘rebanada (slice) de enteros’)
print(‘Daos cuenta que en este caso el límite superior de la rebanada no se’)
print(‘incluye (Python tradicional)’)
print(df.ix[1:3])
[/code]

[code language=”Python”]
print(u’Seleccionamos filas y columnas’)
print(df.ix[1:3, [‘velocidad’, ‘presion’]])
[/code]

[code language=”Python”]
# Algunas de las cosas anteriores se pueden realizar sin usar los métodos .ix() o .xs()</span>
print(df[‘velocidad]
[/code]

[code language=”Python”]
# Da igual si colocamos el slice primero y después las columnas:
df[‘velocidad’][1:3] == df[1:3][‘velocidad’]
[/code]

 
En lo anterior he estado usando los métodos .ix(), .xs() para obtener partes del DataFrame. Son herramientas muy flexibles que nos permiten acceder a los datos de forma muy personalizada. Otras opciones sería usar los métodos .loc(), .iloc(), .select(). Es importante tener en cuenta que las series devueltas cuando se indexa un DataFrame son solo vistas y no una copia de los propios datos. Por tanto, debes ser precavido cuando manipulas los datos (al igual que sucede con los numpy arrays y otros tipos de datos). Lo siguiente (hecho con numpy arrays) es equivalente para las estructuras de datos de Pandas.
[code language=”Python”]
# Vista, ¡Cuidado!
a = np.random.rand(5)
data = a[0:2]
data[:] = -999
print(a)
# Copias
a = np.random.rand(5)
data = a[0:2].copy()
data[:] = -999
print(a)
a = np.random.rand(5)
data = 1 * a[0:2]
data[:] = -999
print(a)
a = np.random.rand(5)
np.copyto(data, a[0:2]) # En este caso, data tiene que existir
data[:] = -999
print(a)
a = np.random.rand(5)
data = np.array(a[0:2])
data[:] = -999
print(a)
[/code]

 
Para acceder a los valores de los índices podemos usar .index.
[code language=”Python”]
df.index
[/code]

 
Para acceder a los valores de las columnas podemos usar .columns.
[code language=”Python”]
df.columns
[/code]

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

8 pensamientos sobre “Pandas (III)”

  1. Muchisimas Gracias por tus tutoriales, son muy didácticos.
    Te quería hacer una consulta: Necesito hacer una busqueda en una columna de un dataFrame pero es una búsqueda tipo excel, es decir, necesito que la búsqueda arroje todas las filas cuyos datos de la columna ‘a’ contengan ‘elec’ siendo los datos de la columna a, por ejemplo: electricidad, agua, electrico…

      1. Genial!!!. Muchas gracias por tu solución, estoy empezando y no conocía la función apply que junto con lambda me parece muy potente.
        Te agradezco enormemente tus tutoriales, para mi son imprescindibles.

      2. Buenas tardes! Muchísimas felicidades por tus tutoriales! Tengo una duda parecida a la que tuvo Paola (en mi caso busco la palabra exacta) pero al ejecutar tu solución me devuelve “TypeError: argument of type ‘float’ is not iterable”. ¿Se te ocurre cual puede ser el problema?
        Muchas gracias!

      3. Sin más datos es difícil saber lo que está pasando. Parece que tu columna no es una columna, sino un solo valor ‘float’ y no se puede iterar sobre el mismo y, por tanto, usar ‘apply’´…

  2. Sonia Arroyo Esteban

    Hola!
    Me gustaría saber como puedo en python transformar n columnas que indican n ciudades donde se indica numero de veces que cada usuario ha visitado, en 1 columna que sea ciudad y numero de veces.
    Mil gracias por la ayuda

Responder a Paola Cancelar respuesta

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

seventy five − = sixty nine