2015-02-09 62 views
5

有沒有方法可以測試數據框是否按照非索引的給定列進行排序(即,對於非索引列,是否存在與is_monotonic()的等效值)而不調用再次重新排序,並且不將列轉換爲索引?檢查是否在Pandas中排序的非索引列

回答

12

pd.algos有一些功能可能有用。他們都是無證實現細節,所以他們可能從發行版本而變化:

>>> 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_*函數採用指定的D型和「類時」布爾應該是False大多數用例的陣列。 (Pandas將它設置爲True,涉及時間表示爲整數的情況。)返回值是一個元組,其第一個元素表示數組是單調不遞減的,第二個元素表示數組是單調不遞增的。其他元組元素是版本相關:

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

所有這些功能假定一個特定的輸入D型細胞,甚至is_lexsorted,其中假定輸入是int64陣列的列表。它傳遞了錯誤的D型,它變得非常困惑:

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 

我不完全知道爲什麼系列還沒有某種短路is_sorted。可能有些東西會使它比看起來更復雜。

+0

這兩個驚人的指向我這個pd.algos庫,並提示!任何你知道任何簡單的方法來處理降序排序的機會?我想要它排序,所以我可以拉第一(最大)行。我可以調用len()並根據需要獲取最後一行,只是尋找速度。 – 2015-02-09 22:15:37

+1

@nick_eu:不是,我很害怕。儘管如此,你總是可以使用'.iloc [-1]'獲取最後一行。當然是 – DSM 2015-02-09 22:23:15

+0

!沒有想到這一點。謝謝! – 2015-02-09 22:28:18

7

可以使用numpy的方法:

import numpy as np 

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

更直接的方式(如你的建議,但你說你不希望它..)被轉換成一個索引,使用is_monotonic屬性:

import pandas as pd 

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

謝謝shx2!這符合我的目標,但事實證明: assert(df.column.diff()[1:] <= 0).all()(diff的第一個值是NaN)比僅用mergesort進行排序要慢。另外,is_monotonic()不能容忍弱單調列,所以在我的情況下不起作用。 :/但也許在一個更大的數據集比較會收益。 – 2015-02-09 22:04:18

+2

也許使用'> = 0'? – DSM 2015-02-09 22:05:44

+0

我正在排序降序,所以我可以搶第一項... – 2015-02-09 22:08:31