Operaciones Con Series en Pandas
En el artículo anterior vimos diferentes maneras de crear series con pandas, ahora vamos a ver diferentes maneras de operar sobre las series, modificarlas tanto por elemento, como en rangos como aplicar funciones sobre todos los elementos.
Extender una serie
Para extender una serie podemos tomar el último valor del índice de la serie y declarar un elemento con ese índice:
myseries = pd.Series(data=[10,20,30,40], index=[0,1,2,3])
maxidx = s.index[-1]
s[maxidx+1] = 50
Concatenar series
Muchas veces no queremos añadir un solo elemento, aparte de que esto es ineficiente, es un proceso lleno de errores, lo mejor si vamos a insertar varios elementos es recolectarlos en una lista o diccionario y juntarlos al final de la lista.
s1 = pd.Series([1,2,3,4])
s2 = pd.Series([5,6,7,8])
s1.append(s2)
esto nos genera una serie que tiene la indexación
>>> s1.append(s2)
0 1
1 2
2 3
3 4
0 5
1 6
2 7
Lo cual puede generar problemas, por lo que existe la opción ignore_index
:
>>> s1.append(s2, ignore_index=True)
0 1
1 2
2 3
3 4
4 5
5 6
6 7
Eliminar un elemento de la serie
Para eliminar un elemento o varios elementos de la serie, existen diferentes funciones. La primera es drop()
s1 = pd.Series([1,2,3,4])
s1.drop(3)
0 1
1 2
2 3
Eliminar un rango de elementos de la serie
Podemos limpiar las series con funciones que liminan diferentes rangos como dropna y drop_duplicates que eliminan los elementos nulos y los duplicados, respectivamente.
>>> s1 = pd.Series([1,None,2,3,4,5,6,7,None,None,8,9])
>>> s1
0 1.0
1 NaN
2 2.0
3 3.0
4 4.0
5 5.0
6 6.0
7 7.0
8 NaN
9 NaN
10 8.0
11 9.0
>>> s1.dropna()
0 1.0
2 2.0
3 3.0
4 4.0
5 5.0
6 6.0
7 7.0
10 8.0
11 9.0
Si necesitamos una serie formada sólamente por los valores únicos, podemos generarla con la operación drop_duplicates
.
>>> s1 = pd.Series([1,1,2,3,4,5,6,7,4,4,8,9])
>>> s1
0 1
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 4
9 4
10 8
11 9
>>> s1.drop_duplicates()
0 1
2 2
3 3
4 4
5 5
6 6
7 7
10 8
11 9
Es importante notar que estas operaciones respetan los índices de la serie original por lo que si queremos que la indexación refleje el cambio debemos reindexar.
>>> s4 = s1.drop_duplicates()
>>> s4
0 1
2 2
3 3
4 4
5 5
6 6
7 7
10 8
11 9
dtype: int64
>>> s4.reset_index(drop=True)
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
dtype: int64
Aplicar operaciones a un solo elemento de la serie
Algunas veces queremos modificar, un sólo elemento de la serie esot lo podemos hacer con una modificación in situ utilizando la función iloc
, esta función actúa recibiendo un índice.
>>> s4.iloc[0] = s4.iloc[0] * 1.25
>>> s4
0 1.25
2 2.00
3 3.00
4 4.00
5 5.00
6 6.00
7 7.00
10 8.00
11 9.00
Otras veces no conocemos la posición pero, si conocemos el valor que queremos cambiar en la serie. Por ejemplo, podemos tener series que vengan con valores nulos en forma de cadenas de texto.
ms = pd.Series([1,2,'NA',4,5,6,'NA'])
>>>clean_ms = ms.replace('NA',-999)
>>>clean_ms
0 1
1 2
2 -999
3 4
4 5
5 6
6 -999
Aplicar funciones y operaciones a toda la serie
Cuando queremos modificar toda la serie o generar una serie modificada utilizando funciones de numpy denominadas Ufuncs, todas las funciones de numpy pueden ser utilizadas de la siguiente manera:
>>> ms=pd.Series([1,2,3,4,5])
>>> ms
0 1
1 2
2 3
3 4
4 5
dtype: int64
>>> 2*ms
0 2
1 4
2 6
3 8
4 10
dtype: int64
Otro ejemplo mas complicado:
ms=pd.Series([1,2,3,4,5])
>>> ms
0 1
1 2
2 3
3 4
4 5
>>> (1/3)*np.cos((1/17)*np.pi*ms)
0 0.327658
1 0.310824
2 0.283406
3 0.246336
4 0.200878
dtype: float64
Conclusión
Las series son uno de los tipos básicos de pandas, de hecho son el tipo de dato que compone los dataframes, que le dan tanta versatilidad a este módulo. Conocer sus operaciones es vital para el dominio de esta versátil librería. si te interesa aprender pandas continúa leyendo nuestra serie que seguirá con el manejo de dataframes.