Tengo un DataFrame de pandas con un índice flotante (en decimal) que uso para buscar valores (similar a un diccionario). Como los flotantes no son exactamente el valor, se supone que deben multiplicarse todo por 10 y convertirlo en enteros .astype(int) antes de establecerlo como índice. Sin embargo, esto parece hacer un floor en lugar de redondear. Por lo tanto, 1.999999999999999992 se convierte en 1 en lugar de 2. El redondeo anterior con el método pandas.DataFrame.round() no evita este problema, ya que los valores aún se almacenan como flotantes.
La idea original (que obviamente plantea un error clave) era esta:
idx = np.arange(1,3,0.001) s = pd.Series(range(2000)) s.index=idx print(s[2.022])tratando de convertir a enteros:
idx_int = idx*1000 idx_int = idx_int.astype(int) s.index = idx_int for i in range(1000,3000): print(s[i])la salida siempre es un poco aleatoria ya que el valor 'real' de un número entero puede estar ligeramente por encima o por debajo del valor deseado. En este caso el índice contiene dos veces el valor 1000 y no contiene el valor 2999.
Tienes razón, astype(int) hace una conversión hacia cero:
'entero' o 'con signo': tipo de int con signo más pequeño
de la documentación pandas.to_numeric (que está vinculada desde astype() para conversiones numéricas).
Si desea redondear, debe hacer una ronda flotante y luego convertir a int:
df.round(0).astype(int)Utilice otras funciones de redondeo, según sus necesidades.
Si entiendo bien, ¿podría simplemente realizar la operación de redondeo seguida de convertirlo en un número entero?
s1 = pd.Series([1.2,2.9]) s1 = s1.round().astype(int)Lo que da la salida:
0 1 1 3 dtype: int32En caso de que el marco de datos contenga valores numéricos y no numéricos y solo desee tocar campos numéricos:
df = df.applymap(lambda x: int(round(x, 0)) if isinstance(x, (int, float)) else x)