¿Cómo hacer una serie en Python?

Series Numéricas en Python: Guía Completa

22/09/2024

Valoración: 4.88 (10355 votos)

En el vasto universo de la programación con Python, la capacidad de generar y manipular secuencias de números es una habilidad fundamental. Ya sea que necesitemos iterar a través de una colección, crear índices para estructuras de datos o preparar conjuntos de datos para análisis, Python ofrece herramientas poderosas y eficientes para estas tareas. Este artículo explorará dos de las formas más comunes y versátiles de obtener series de números: la función integrada range() y las robustas Series de la biblioteca Pandas, destacando sus usos, características y cómo elegir la herramienta adecuada para cada escenario.

¿Cuál es la secuencia de cálculos en Python?
Python siempre evaluará primero los operadores aritméticos (** es el más alto, luego la multiplicación/división, y luego la suma/resta) . A continuación, vienen los operadores relacionales. Finalmente, los operadores lógicos se evalúan al final.
Índice de Contenido

La Función range(): Generación de Secuencias al Vuelo

La función range() en Python es una de las utilidades más empleadas para generar secuencias de números enteros. A diferencia de crear una lista completa en memoria, range() genera los números 'al vuelo' (on the fly), lo que la hace extremadamente eficiente en términos de memoria, especialmente cuando se trabaja con secuencias muy largas. Es ideal para bucles for, donde necesitamos iterar un número específico de veces o sobre un rango de índices.

range(n): La Forma Más Común (Un Parámetro)

La forma más básica de utilizar range() es pasarle un solo argumento entero, n. En este caso, range(n) devuelve una secuencia numérica que comienza en 0 y se extiende hasta, pero sin incluir, n. Es decir, genera n números, empezando por el cero. Esta característica es perfecta para generar los números de índice para acceder a elementos en colecciones como cadenas de texto o listas.

Por ejemplo, range(5) producirá los números 0, 1, 2, 3, 4. Si intentamos imprimir el objeto range directamente, veremos algo como range(0, 5), lo que indica que es un objeto iterable. Para ver los números que genera, a menudo se convierte a una lista con list(), aunque esto solo se hace por motivos de visualización o si realmente se necesita una lista en memoria.

s = 'Python' print(len(s)) # Salida: 6 for i in range(len(s)): print(i, s[i]) # Salida: # 0 P # 1 y # 2 t # 3 h # 4 o # 5 n

Más ejemplos de range(n) convertidos a lista para visualización:

print(list(range(5))) # Salida: [0, 1, 2, 3, 4] print(list(range(10))) # Salida: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(list(range(2))) # Salida: [0, 1]

Es importante notar que range(0) o range() con un número negativo (por ejemplo, range(-42)) no generarán ningún número, resultando en una secuencia vacía, similar a una lista vacía []. Esto se debe a que el número de elementos generados (n) sería cero o negativo, lo cual no tiene sentido en este contexto.

print(list(range(1))) # Salida: [0] print(list(range(0))) # Salida: [] print(list(range(-42))) # Salida: []

reversed(): Iterando en Orden Inverso

A menudo, la necesidad es recorrer los índices en orden inverso. Aunque se podría lograr con un range() de tres parámetros con un paso negativo, la forma más elegante y Pythonica es usar la función reversed(). Esta función toma una colección lineal (como el objeto range()) y devuelve un iterador que produce sus elementos en orden inverso.

s = 'Python' print(len(s)) # Salida: 6 for i in reversed(range(len(s))): print(i, s[i]) # Salida: # 5 n # 4 o # 3 h # 2 t # 1 y # 0 P

range(start, stop): Dos Parámetros

Cuando necesitamos que la secuencia comience en un número distinto de cero, utilizamos la forma de dos parámetros: range(start, stop). Esta función genera números que comienzan en start y se extienden hasta, pero sin incluir, stop. El número stop es exclusivo.

print(list(range(5, 10))) # Salida: [5, 6, 7, 8, 9] print(list(range(5, 7))) # Salida: [5, 6] print(list(range(5, 5))) # Salida: [] (Si start es mayor o igual que stop, no se generan números) print(list(range(0, 5))) # Salida: [0, 1, 2, 3, 4]

Un buen truco mnemotécnico es pensar que el número stop es un 'límite estricto': tan pronto como los números generados alcanzan o superan este límite, la secuencia termina.

range(start, stop, step): Tres Parámetros

La forma más flexible de range() es la de tres parámetros: range(start, stop, step). Aquí, start es el número inicial, stop es el límite exclusivo, y step es la cantidad por la cual se incrementa (o decrementa si es negativo) cada número en la secuencia.

¿Cómo obtener una serie de números en Python?
La función range() de Python crea una colección de números sobre la marcha, como 0, 1, 2, 3, 4. Esto es muy útil, ya que los números se pueden usar para indexar en colecciones como cadenas. La función range() se puede llamar de diferentes maneras.
print(list(range(0, 10, 2))) # Salida: [0, 2, 4, 6, 8] print(list(range(0, 10, 6))) # Salida: [0, 6] print(list(range(200, 800, 100))) # Salida: [200, 300, 400, 500, 600, 700]

Si el step es negativo, la secuencia disminuye desde start hasta stop. La regla de exclusión de stop sigue siendo la misma: los números que alcanzan o superan el stop (en la dirección del paso) son omitidos.

print(list(range(10, 5, -1))) # Salida: [10, 9, 8, 7, 6] print(list(range(10, 5, -2))) # Salida: [10, 8, 6] print(list(range(6, 5, -2))) # Salida: [6] print(list(range(5, 5, -2))) # Salida: [] (start igual a stop, no hay números) print(list(range(4, 5, -2))) # Salida: [] (supera el stop en la dirección del paso)

Pandas Series: Series de Datos Estructuradas

Mientras que range() es excelente para secuencias de números simples y eficientes en bucles, cuando entramos en el ámbito del análisis y manipulación de datos, la biblioteca Pandas se convierte en una herramienta indispensable. Una Pandas Series es como una única columna de datos en una hoja de cálculo. Es una estructura de datos unidimensional que puede contener muchos tipos de datos, como números, palabras u otros objetos de Python. Cada valor en una Serie está asociado con un índice, lo que facilita enormemente la recuperación y manipulación de datos.

Creación de una Pandas Series Vacía

Una Serie vacía no contiene datos y puede ser útil cuando planeamos añadir valores más tarde. Podemos crear una Serie vacía usando la función pd.Series(). Por defecto, una Serie vacía tiene un tipo de dato float64, pero podemos especificar otro tipo si es necesario.

import pandas as pd ser_vacia = pd.Series() print(ser_vacia) # Salida: # Series([], dtype: float64)

Creación de una Serie a partir de un Array NumPy

Si ya tenemos datos almacenados en un array NumPy, podemos convertirlos fácilmente en una Pandas Series. Esto es especialmente útil cuando se trabaja con datos numéricos en el contexto de la computación científica.

import pandas as pd import numpy as np data_np = np.array(['g', 'e', 'e', 'k', 's']) ser_np = pd.Series(data_np) print(ser_np) # Salida: # 0 g # 1 e # 2 e # 3 k # 4 s # dtype: object

Creación de una Serie a partir de una Lista Python

Una de las formas más sencillas de crear una Serie es pasando una lista de Python a la función pd.Series(). Pandas asigna automáticamente un índice numérico a cada elemento, comenzando desde 0.

import pandas as pd data_list = ['g', 'e', 'e', 'k', 's'] ser_list = pd.Series(data_list) print(ser_list) # Salida: # 0 g # 1 e # 2 e # 3 k # 4 s # dtype: object

Creación de una Serie a partir de un Diccionario Python

Un diccionario en Python almacena datos como pares clave-valor. Cuando convertimos un diccionario en una Pandas Series, las claves del diccionario se convierten en las etiquetas del índice y los valores se convierten en los datos de la Serie. Este método es muy útil para datos etiquetados, preservando su estructura y permitiendo un acceso rápido.

import pandas as pd data_dict = {'Geeks': 10, 'for': 20, 'geeks': 30} ser_dict = pd.Series(data_dict) print(ser_dict) # Salida: # Geeks 10 # for 20 # geeks 30 # dtype: int64

Creación de una Serie utilizando Funciones NumPy

Para crear series con patrones numéricos más complejos o para modelado estadístico, podemos integrar funciones de NumPy directamente. Funciones como numpy.linspace() (para números espaciados uniformemente en un rango) o numpy.random.randn() (para números aleatorios de una distribución normal) son particularmente útiles.

import numpy as np import pandas as pd ser_linspace = pd.Series(np.linspace(1, 10, 5)) print(ser_linspace) # Salida: # 0 1.00 # 1 3.25 # 2 5.50 # 3 7.75 # 4 10.00 # dtype: float64

Creación de una Serie utilizando range()

Sí, la función range() de Python puede ser directamente utilizada para crear una Pandas Series. Esto es útil para generar una secuencia de valores numéricos de forma estructurada sin necesidad de especificar manualmente cada elemento.

import pandas as pd ser_range = pd.Series(range(5, 15)) print(ser_range) # Salida: # 0 5 # 1 6 # 2 7 # 3 8 # 4 9 # 5 10 # 6 11 # 7 12 # 8 13 # 9 14 # dtype: int64

Creación de una Serie utilizando List Comprehension

La comprensión de listas es una forma concisa y elegante de generar secuencias y aplicar transformaciones en una sola línea de código. Este método es útil cuando necesitamos crear secuencias estructuradas dinámicamente y, opcionalmente, asignar un índice personalizado.

¿Cómo obtener una serie de números en Python?
La función range() de Python crea una colección de números sobre la marcha, como 0, 1, 2, 3, 4. Esto es muy útil, ya que los números se pueden usar para indexar en colecciones como cadenas. La función range() se puede llamar de diferentes maneras.
import pandas as pd ser_comp = pd.Series(range(1, 20, 3), index=[x for x in 'abcdefg']) print(ser_comp) # Salida: # a 1 # b 4 # c 7 # d 10 # e 13 # f 16 # g 19 # dtype: int64

range() vs. Pandas Series: ¿Cuándo usar cuál?

Aunque ambos son herramientas para crear secuencias, sus propósitos y capacidades son distintos. Comprender cuándo usar uno u otro es clave para escribir código eficiente y legible.

Característicarange()Pandas Series
Propósito PrincipalGenerar secuencias de enteros para iteración o indexación.Almacenar y manipular datos unidimensionales con índices.
Tipo de DatosSolo enteros.Diversos tipos de datos (int, float, str, bool, objetos).
AlmacenamientoGenera números 'al vuelo' (objeto iterable), eficiente en memoria.Almacena todos los datos en memoria, más robusto para análisis.
IndexaciónImplícitamente por posición (0, 1, 2...).Índices explícitos personalizables (etiquetas, números).
Funcionalidades AdicionalesBásicas de secuencia.Amplias funciones de análisis, alineación de datos, operaciones vectorizadas.
Uso TípicoBucles for, generar índices simples.Análisis de datos, series de tiempo, limpieza de datos, preparación para ML.

Utiliza range() cuando solo necesitas una secuencia de números enteros para controlar un bucle o para generar índices simples sin la necesidad de almacenar explícitamente todos los números en memoria. Es la opción más ligera y rápida para estos casos.

Por otro lado, opta por una Pandas Series cuando tus datos tienen más complejidad: cuando necesitas índices personalizados, cuando los datos no son solo enteros, cuando planeas realizar operaciones matemáticas o estadísticas complejas sobre la secuencia, o cuando la secuencia es parte de un conjunto de datos más grande que se beneficiará de las capacidades de Pandas.

Preguntas Frecuentes (FAQs)

¿Es range() una lista en Python?

No, range() no es una lista. Es un objeto de tipo 'range' que es un iterable. Esto significa que produce números bajo demanda, a medida que se itera sobre él. No almacena todos los números en memoria al mismo tiempo, lo que lo hace muy eficiente para secuencias grandes. Puedes convertir un objeto range en una lista explícitamente usando list(range(...)) si necesitas que todos los elementos estén en memoria como una lista.

¿Para qué se usa el índice en una Pandas Series?

El índice en una Pandas Series es crucial porque proporciona una forma de etiquetar y acceder a los datos. Permite una recuperación de datos más intuitiva y facilita operaciones como la alineación de datos entre diferentes Series o DataFrames. Además de los índices numéricos por defecto (0, 1, 2...), puedes usar etiquetas personalizadas (cadenas de texto, fechas, etc.), lo que hace que la Serie sea muy flexible y auto-descriptiva.

¿Puedo tener diferentes tipos de datos en una sola Pandas Series?

Sí, una Pandas Series puede contener diferentes tipos de datos. Si intentas combinar tipos de datos heterogéneos (por ejemplo, números enteros y cadenas de texto), Pandas intentará encontrar el tipo de dato más general que pueda contener todos los elementos, a menudo resultando en un tipo de dato object. Sin embargo, para un rendimiento óptimo, es preferible que los datos dentro de una Serie sean del mismo tipo si es posible.

¿Cuál es la secuencia de cálculos o precedencia de operadores en Python?

Python sigue un orden de precedencia específico para evaluar expresiones. Primero evalúa los operadores aritméticos, con la exponenciación (**) teniendo la mayor precedencia, seguida por la multiplicación (*), división (/, //, %), y finalmente la suma (+) y resta (-). Después de los operadores aritméticos, se evalúan los operadores relacionales (==, !=, <, >, etc.). Finalmente, los operadores lógicos (not, and, or) se evalúan al final. Los paréntesis pueden usarse para anular este orden de precedencia, forzando la evaluación de ciertas partes de la expresión primero.

Conclusión

Dominar la generación de series de números en Python es un paso fundamental para cualquier programador. La función range() es una herramienta simple pero potente para iteraciones eficientes y la creación de secuencias numéricas básicas. Por otro lado, las Pandas Series elevan la manipulación de secuencias a un nivel superior, ofreciendo una estructura de datos robusta y flexible, ideal para el análisis y la ciencia de datos. Al comprender las fortalezas de cada una, podrás elegir la herramienta adecuada para cada tarea, optimizando tanto el rendimiento como la claridad de tu código Python.

Si quieres conocer otros artículos parecidos a Series Numéricas en Python: Guía Completa puedes visitar la categoría Cálculos.

Subir