python - read_sql - pandas union dataframe
¿Cuál es el impacto en el rendimiento de índices no únicos en pandas? (1)
De la documentación de los pandas, he deducido que los índices con valores únicos hacen que ciertas operaciones sean eficientes, y que los índices no únicos se toleran ocasionalmente.
Desde el exterior, no parece que los índices no únicos se aprovechen de ninguna manera. Por ejemplo, la siguiente consulta ix
es lo suficientemente lenta como para que parezca que está escaneando todo el dataframe
In [23]: import numpy as np
In [24]: import pandas as pd
In [25]: x = np.random.randint(0, 10**7, 10**7)
In [26]: df1 = pd.DataFrame({''x'':x})
In [27]: df2 = df1.set_index(''x'', drop=False)
In [28]: %timeit df2.ix[0]
1 loops, best of 3: 402 ms per loop
In [29]: %timeit df1.ix[0]
10000 loops, best of 3: 123 us per loop
(Me doy cuenta de que las dos consultas ix
no devuelven lo mismo; es solo un ejemplo de que las llamadas a ix
en un índice no exclusivo parecen mucho más lentas)
¿Hay alguna manera de convencer a los pandas para que utilicen métodos de búsqueda más rápidos, como la búsqueda binaria en índices no únicos y / o clasificados?
Cuando el índice es único, los pandas usan una tabla hash para asignar la clave al valor O (1). Cuando el índice no es único y está ordenado, los pandas usan la búsqueda binaria O (logN), cuando el índice se ordena al azar, los pandas deben verificar todas las claves en el índice O (N).
Puede llamar sort_index
método sort_index
:
import numpy as np
import pandas as pd
x = np.random.randint(0, 200, 10**6)
df1 = pd.DataFrame({''x'':x})
df2 = df1.set_index(''x'', drop=False)
df3 = df2.sort_index()
%timeit df1.loc[100]
%timeit df2.loc[100]
%timeit df3.loc[100]
resultado:
10000 loops, best of 3: 71.2 µs per loop
10 loops, best of 3: 38.9 ms per loop
10000 loops, best of 3: 134 µs per loop