2015-02-09 43 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