Estoy buscando el método más rápido para obtener cada valor en mi columna con solo dos dígitos después del punto sin usar round()

pd.Series:

Entrada:

1.42345
12.33444
111.66777
2.059999

Producción prevista:

1.42
12.33
111.66
2.05

Estoy pensando en convertirlo en cadena y luego usar slice, pero en el segmento necesito usar las opciones de inicio y detención, es difícil cuando los dígitos anteriores tienen una longitud diferente.

Si no habrá otra opción, usaré .str.extract(r'([0-9]{1,5}.[0-9]{2})'), pero ¿tal vez sí? algunas limitaciones para mostrar flotante sin redondeo?

No es tema duplicado, la solución de este es redondear los valores: Truncar a tres decimales en Python

0
sygneto 9 oct. 2019 a las 16:27

3 respuestas

La mejor respuesta

Una opción es tomar el {{X0} } entre 0.01 y para dividir nuevamente el valor entre 100:

s.floordiv(0.01).div(100)

0      1.42
1     12.33
2    111.66
3      2.05
dtype: float64

Claramente funciona mejor que la conversión a cadena y la extracción hasta el segundo decimal:

s = pd.Series(np.random.randn(1_000_000))

%timeit s.astype(str).str.extract(r'(\d+\.\d{2})')
# 1.76 s ± 42.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit s.floordiv(0.01).div(100)
# 42.1 ms ± 3.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit s//0.01/100
# 40.5 ms ± 3.31 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
2
yatu 9 oct. 2019 a las 13:39

Hay nuevas especificaciones de formato, Formato de cadena Especificación Mini-idioma:

Puedes hacer lo mismo que:

"{0:.2f}".format(1.42345) // output 1.42

Tenga en cuenta que lo anterior devuelve una cadena. Para obtener como flotador, simplemente envuelva con flotador (...):

float("{0:.2f}".format(1.42345)) // output 1.42
0
Rahul Gupta 9 oct. 2019 a las 13:36

Piso div

s//0.01/100
0      1.42
1     12.33
2    111.66
3      2.05
Name: dol, dtype: float64
0
YOBEN_S 9 oct. 2019 a las 13:30
58305270