2015-02-09 24 views
5

'da dizine eklenmeyen dizinin olup olmadığını kontrol edin Bir veri çerçevesinin, dizini olmayan belirli bir sütunla mı (örneğin, dizin dışı sütunlar için is_monotonic() eşdeğeri var) sıralanıp sınandığını sınamanın bir yolu var mı Her şeyi tekrar ve bir sütunu bir dizine dönüştürmeden (Eğer önerilen gibi, ama sen bunu istemiyorum demek ..)Pandalar

import numpy as np 

def is_df_sorted(df, colname): 
    return (np.diff(df[colname]) > 0).all() 

bir daha doğrudan bir yaklaşım olduğu bir dizin dönüştürmek ve is_monotonic özelliğini kullanın:

cevap

12

. Hepsi belgesiz uygulama ayrıntılarına; yani hepsi bir sürümden diğerine değişebilir:

>>> 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  

is_monotonic_* işlevleri belirtilen d_type ve çoğu kullanım durumları için False olmalıdır "zamansal" boolean bir dizi alır. (Pandalar, tamsayılar olarak gösterilen zamanları içeren bir durum için True'a ayarlar.) Dönüş değeri, ilk öğesi dizinin tekdüze olarak azalmaz olup olmadığını ve ikinci öğesi dizinin monotonik olarak artmadığını temsil eden bir tuple'dır.

>>> 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 

Tüm bu fonksiyonlar girdi int64 diziler listesi varsayar belirli girdi d_type, hatta is_lexsorted, varsayalım: Diğer tanımlama grubu elemanları versiyon bağlıdır. o yanlış d_type geçirin ve gerçekten karışır:

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 

Serisi zaten is_sorted kısa devre çeşit yok neden geldiğimden emin değilim. Göründüğünden daha zorlaştıran bir şey olabilir.

+0

Hem bu pd.algos kütüphanesine işaret ettiğim için hem de inanılmaz! İnenle uğraşmak için herhangi bir kolay yolu biliyor musun? Sıralı olmasını istiyorum, böylece ilk (en büyük) satırı alabilirim. Len() 'yi arayabilir ve gerekirse son satırı alabilirim, sadece hız arıyordum. –

+1

@nick_eu: gerçekten değil, korkarım. Yine de son satırı almak için '.iloc [-1]' yi kullanabilirsiniz. Tabii ki – DSM

+0

! bunu düşünmemişti. Teşekkürler! –

7

Sen numpy yöntemi kullanabilirsiniz Kullanım olabilir pd.algos işlevleri bir avuç vardır

import pandas as pd 

def is_df_sorted(df, colname): 
    return pd.Index(df[colname]).is_monotonic 
+0

Teşekkürler shx2! Bu benim amacımla ilgileniyor, ancak çıkıyor: assert(df.column.diff()[1:] <= 0).all() (ilk farkın bir NaN olması), bir mergesort ile sıralamaktan daha yavaştır. Ayrıca, is_monotonic() zayıf monotonik sütunları tolere etmez, bu yüzden benim durumumda çalışmaz. :/Ama belki de daha büyük bir veri kümesi farkına karşılık gelir. –

+2

Belki '> = 0' kullanın? – DSM

+0

İnişlerimi sıralıyorum, böylece ilk öğeyi alabilirim ... –