pandas.DF()中的列是否单调递增?

ame*_*hta 8 python data-analysis pandas

我可以通过使用is_monotonic方法检查pandas.DataFrame()的索引是否单调增加.但是,我想检查其中一个列值是否严格增加值(浮点数/整数)?

In [13]: my_df = pd.DataFrame([1,2,3,5,7,6,9])

In [14]: my_df
Out[14]: 
   0
0  1
1  2
2  3
3  5
4  7
5  6
6  9

In [15]: my_df.index.is_monotonic
Out[15]: True
Run Code Online (Sandbox Code Playgroud)

Ome*_*erB 16

Pandas 0.19添加了一个公共Series.is_monotonicAPI(以前,这只在未记录的algos模块中可用).

(更新)请注意,尽管其名称,但Series.is_monotonic仅指示系列是否单调增加(相当于使用Series.is_monotonic_increasing).换句话说,使用Series.is_monotonic_decreasing.无论如何,两者都是非严格的,但你可以将它们结合起来is_unqiue以获得严格.

例如:

my_df = pd.DataFrame([1,2,2,3], columns = ['A'])

my_df['A'].is_monotonic    # non-strict
Out[1]: True

my_df['A'].is_monotonic_increasing    # equivalent to is_monotonic
Out[2]: True

(my_df['A'].is_monotonic_increasing and my_df['A'].is_unique)    # strict  
Out[3]: False

my_df['A'].is_monotonic_decreasing    # Other direction (also non-strict)
Out[4]: False
Run Code Online (Sandbox Code Playgroud)

您可以使用apply在DataFrame级别运行它:

my_df = pd.DataFrame({'A':[1,2,3],'B':[1,1,1],'C':[3,2,1]})
my_df
Out[32]: 
   A  B  C
0  1  1  3
1  2  1  2
2  3  1  1

my_df.apply(lambda x: x.is_monotonic)
Out[33]: 
A     True
B     True
C    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)


Jan*_*cke 5

可能是最好的方式是,以获得数据帧列作为numpy的阵列不具有(使用围绕复制数据.values属性经由索引列选择之后),并且接着使用用于检查单调基于numpy的测试:

def monotonic(x):
    return np.all(np.diff(x) > 0)

monotonic(df[0].values)
Run Code Online (Sandbox Code Playgroud)

一个纯Python实现,从这里借用:Python - 如何检查列表单调性

def strictly_increasing(L):
    return all(x<y for x, y in zip(L, L[1:]))
Run Code Online (Sandbox Code Playgroud)


acu*_*ner 0

你可以计算一下这个:

diff = df[0] - df[0].shift(1)
is_monotonic = (diff < 0).sum() == 0 or (diff > 0).sum() == 0
Run Code Online (Sandbox Code Playgroud)

您在这里要检查的只是差异全部 >= 0 或全部 <= 0。

编辑:因为你只想严格增加,那么它只是:

is_monotonic = (diff <= 0).sum() == 0
Run Code Online (Sandbox Code Playgroud)