Saltar al contenido

Asignación de rangos de valores en el marco de datos de pandas

Solución:

Hay algunas alternativas.

Pandas vía pd.cut / NumPy vía np.digitize

Puede construir una lista de límites y luego usar funciones de biblioteca especializadas. Esto se describe en la solución de @ EdChum y también en esta respuesta.

NumPy vía np.select

df = pd.DataFrame(data=np.random.randint(1,10,10), columns=['a'])

criteria = [df['a'].between(1, 3), df['a'].between(4, 7), df['a'].between(8, 10)]
values = [1, 2, 3]

df['b'] = np.select(criteria, values, 0)

Los elementos de criteria son series booleanas, por lo que liza de valores, puedes usar df['a'].isin([1, 3])etc.

Mapeo de diccionario a través de range

d = {range(1, 4): 1, range(4, 8): 2, range(8, 11): 3}

df['c'] = df['a'].apply(lambda x: next((v for k, v in d.items() if x in k), 0))

print(df)

   a  b  c
0  1  1  1
1  7  2  2
2  5  2  2
3  1  1  1
4  3  1  1
5  5  2  2
6  4  2  2
7  4  2  2
8  9  3  3
9  3  1  1

IIUC que podrías usar cut lograr esto:

In[33]:
pd.cut(df['a'], bins=[0,3,7,11], right=True, labels=False)+1

Out[33]: 
0    2
1    3
2    3
3    1
4    1
5    1
6    1
7    3
8    2
9    2

Aquí pasarías los valores de corte a cut, y esto categorizará sus valores, pasando labels=False les dará un valor ordinal (basado en cero) por lo que solo +1 a ellos

Aquí puedes ver cómo se calcularon los cortes:

In[34]:
pd.cut(df['a'], bins=[0,3,7,11], right=True)

Out[34]: 
0     (3, 7]
1    (7, 11]
2    (7, 11]
3     (0, 3]
4     (0, 3]
5     (0, 3]
6     (0, 3]
7    (7, 11]
8     (3, 7]
9     (3, 7]
Name: a, dtype: category
Categories (3, interval[int64]): [(0, 3] < (3, 7] < (7, 11]]
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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