Esiste un modo per verificare se un dataframe è ordinato da una determinata colonna che non è un indice (cioè esiste un equivalente a is_monotonic() per le colonne non indicizzate) senza chiamare un riordina di nuovo e senza convertire una colonna in un indice?Controlla se la colonna non indicizzata è ordinata in Panda
risposta
ci sono una manciata di funzioni in pd.algos
che potrebbe essere utile. Sono tutti i dettagli di implementazione senza documenti, in modo che possa cambiare da una release all'altra:
>>> pd.algos.is[TAB]
pd.algos.is_lexsorted pd.algos.is_monotonic_float64 pd.algos.is_monotonic_object
pd.algos.is_monotonic_bool pd.algos.is_monotonic_int32
pd.algos.is_monotonic_float32 pd.algos.is_monotonic_int64
Le is_monotonic_*
funzioni accettano un array del DTYPE specificato e un valore booleano "tipo tempo" che dovrebbe essere False
per la maggior parte dei casi d'uso. (Panda lo imposta su True
per un caso che coinvolge tempi rappresentati come numeri interi.) Il valore di ritorno è una tupla il cui primo elemento rappresenta se l'array è monotonicamente non decrescente e il cui secondo elemento rappresenta se l'array è monotonicamente non crescente. Altri elementi tupla sono dipendenti dalla versione:
>>> df = pd.DataFrame({"A": [1,2,2], "B": [2,3,1]})
>>> pd.algos.is_monotonic_int64(df.A.values, False)[0]
True
>>> pd.algos.is_monotonic_int64(df.B.values, False)[0]
False
Tutte queste funzioni assumono un dtype ingresso specifico, anche is_lexsorted
, che assume l'input è una lista di int64
array. Passare così il DTYPE sbagliato, e diventa molto confuso:
In [32]: pandas.algos.is_lexsorted([np.array([-2, -1], dtype=np.int64)])
Out[32]: True
In [33]: pandas.algos.is_lexsorted([np.array([-2, -1], dtype=float)])
Out[33]: False
In [34]: pandas.algos.is_lexsorted([np.array([-1, -2, 0], dtype=float)])
Out[34]: True
Non sono del tutto sicuro perché Series non hanno già una sorta di corto circuito is_sorted
. Potrebbe esserci qualcosa che lo rende più complicato di quanto sembri.
È possibile utilizzare il metodo NumPy:
import numpy as np
def is_df_sorted(df, colname):
return (np.diff(df[colname]) > 0).all()
un approccio più diretto (come da te suggerito, ma tu dici che non lo vuoi ..) è di convertire ad un indice e utilizzare la proprietà is_monotonic
:
import pandas as pd
def is_df_sorted(df, colname):
return pd.Index(df[colname]).is_monotonic
Grazie shx2! Questo è il mio obiettivo, ma risulta: assert(df.column.diff()[1:] <= 0).all()
(il primo valore di diff è un NaN) è più lento di un semplice ordinamento con un mergesort. Inoltre, is_monotonic() non tollera colonne debolmente monotone, quindi non funziona nel mio caso. :/Ma forse su un set di dati più grande sarebbe il profitto. –
Forse usare '> = 0'? – DSM
sto ordinando in modo discendente così posso prendere il primo oggetto ... –
- 1. Controlla se la colonna dataframe è Categorica
- 2. Controlla se la stringa è in un dataframe panda
- 3. Aggiungere la colonna indicizzata a DataFrame con i panda
- 4. Come posso essere avvisato se una colonna DataGrid è ordinata (e non ordinata)
- 5. Panda Python: controlla se qualche valore è NaN in DataFrame
- 6. panda - ottenere la maggior parte del valore recente di una determinata colonna indicizzata da un'altra colonna (ottenere il massimo valore di una determinata colonna indicizzata da un'altra colonna)
- 7. Ottenere la colonna ordinata corrente in DataTable
- 8. La carta non ordinata è davvero non ordinata?
- 9. creare una colonna indicizzata in sqlite
- 10. Smarty: controlla se la variabile è nell'array
- 11. è il conteggio (colonna indicizzata) più veloce del conteggio (*)?
- 12. controlla se la stringa è l'immagine
- 13. Controlla se la colonna esiste nella tabella Mysql tramite php
- 14. Controlla se la finestra è un MessageBox
- 15. Controlla se la stringa è vuota
- 16. getline controlla se la linea è spazio
- 17. Controlla se la directory è vuota
- 18. Controlla se qualcosa non è in una lista in Python
- 19. Datagrid in WPF - 1 colonna predefinita ordinata
- 20. Controlla se l'utente è online (in diretta)
- 21. Impostazione della colonna ordinata predefinita in Datatable
- 22. Controlla se la stringa non contiene un'altra stringa
- 23. Controlla se PyObject è None
- 24. Controlla se la mia QMainWindow è attualmente visibile in Qt
- 25. Controlla se la larghezza massima è impostata, in jQuery?
- 26. Controlla se la mia app è in esecuzione su Android
- 27. Controlla se il cronometro è in funzione
- 28. Controlla se bulk è vuoto in mongoDB
- 29. Controlla se la richiesta è AJAX in Python
- 30. Python: controlla se l'elemento non è in due elenchi?
Incredibile sia per avermi indirizzato a questa libreria pd.algos, sia per la punta! Qualche possibilità che tu conosca un modo semplice per affrontare tipi decrescenti? Lo voglio ordinato in modo da poter tirare la prima (più grande) fila. Posso semplicemente chiamare len() e ottenere l'ultima riga, se necessario, cercando solo la velocità. –
@nick_eu: non proprio, temo. Puoi sempre usare '.iloc [-1]' per ottenere l'ultima riga, però. – DSM
ovviamente! non ci avevo pensato. Grazie! –