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)