Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

337
Vistas
¿Un error lexicográfico en pandas?

Por favor, tome esta pregunta a la ligera por curiosidad:

Mientras intentaba ver cómo funciona el corte en MultiIndex, me encontré con la siguiente situación ↓

 # Simple MultiIndex Creation index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]]) # Making Series with that MultiIndex data = pd.Series(np.random.randint(10, size=6), index=index)

Devoluciones:

un 1 5
   2 0
c 1 8
   2 6
segundo 1 6
   2 3
tipo: int32

TENGA EN CUENTA que los índices no están ordenados, es decir. a, c, b es el orden que dará como resultado el error esperado que queremos al cortar.

 # When we do slicing data.loc["a":"c"]

Errores como:

UnsortedIndexErrorUnsortedIndexError

----> 1 datos.loc["a":"c"]
UnsortedIndexError: 'La longitud de la clave (1) era mayor que la profundidad de MultiIndex lexsort (0)'

Eso es de esperar. Pero ahora, después de hacer los siguientes pasos:

 # Making a DataFrame data = data.unstack() # Redindexing - to unsort the indices like before data = data.reindex(["a", "c", "b"]) # Which looks like 1 2 a 5 0 c 8 6 b 6 3 # Then again making series data = data.stack() # Reindex Again! data = data.reindex(["a", "c", "b"], level=0) # Which looks like before a 1 5 2 0 c 1 8 2 6 b 1 6 2 3 dtype: int32

El problema

Entonces, ahora el proceso es: Series → Unstack → DataFrame → Stack → Series

Ahora, si hago el corte como antes (todavía con los índices sin clasificar) ¡no obtenemos ningún error!

 # The same slicing data.loc["a":"c"]

Resultados sin error:

un 1 5
   2 0
c 1 8
   2 6
tipo: int32

Incluso si data.index.is_monotonic → False . Entonces todavía ¿por qué podemos cortar?

Entonces la pregunta es: ¿POR QUÉ? .

Espero que hayas entendido la situación aquí. Porque mira, la misma serie que estaba antes de dar el error, después de la operación de unstack y stack no da ningún error.

Entonces, ¿es un error o un nuevo concepto que me estoy perdiendo aquí?

¡Gracias!
Aayush ∞ Shah

ACTUALIZACIÓN : He usado data.reindex() para desordenarlo una vez más. Por favor, míralo de nuevo.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La diferencia entre sus 2 marcos de datos es la siguiente:

 index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]]) data = pd.Series(np.random.randint(10, size=6), index=index) data2 = data.unstack().reindex(["a", "c", "b"]).stack() >>> data.index.codes FrozenList([[0, 0, 2, 2, 1, 1], [0, 1, 0, 1, 0, 1]]) >>> data2.index.codes FrozenList([[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

Incluso si sus dos índices tienen la misma apariencia (valores), el índice interno (códigos) es diferente.

Compruebe este método de MultiIndex :

 Create a new MultiIndex from the current to monotonically sorted items IN the levels. This does not actually make the entire MultiIndex monotonic, JUST the levels. The resulting MultiIndex will have the same outward appearance, meaning the same .values and ordering. It will also be .equals() to the original.

respuesta antigua

 # Making a DataFrame data = data.unstack() # Which looks like # <- WRONG 1 2 # 1 2 a 5 0 # a 8 0 c 8 6 # b 4 1 b 6 3 # c 7 6 # Then again making series data = data.stack() # Which looks like before # <- WRONG a 1 5 # a 1 2 2 0 # 2 1 c 1 8 # b 1 0 2 6 # 2 1 b 1 6 # c 1 3 2 3 # 2 9 dtype: int32

Si desea utilizar el corte, debe verificar si el índice es monótono:

 # Simple MultiIndex Creation index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]]) # Making Series with that MultiIndex data = pd.Series(np.random.randint(10, size=6), index=index) >>> data.index.is_monotonic False >>> data.unstack().stack().index.is_monotonic True >>> data.sort_index().index.is_monotonic True
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda