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

问题描述 投票:0回答:5

我可以使用 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
python pandas data-analysis
5个回答
39
投票

Pandas 0.19 添加了公共

Series.is_monotonic
API(以前,这仅在未记录的
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

您可以使用

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

6
投票

可能最好的方法是获取数据帧列作为 numpy 数组,而不复制数据(通过索引选择列后使用

.values
属性),然后使用基于 numpy 的测试来检查单调性:

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

monotonic(df[0].values)

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

def strictly_increasing(L):
    return all(x<y for x, y in zip(L, L[1:]))

2
投票

如果两个索引相等,它们不会是唯一的。所以你可以使用:

my_df.Index.is_monotonic and my_df.Index.is_unique

这些属性记录在0.15.2版本中; is_unique 在 0.14.1 中被粗略提及,但只对我有用。见

http://pandas.pydata.org/pandas-docs/version/0.15.2/api.html#index

http://pandas.pydata.org/pandas-docs/version/0.14.1/ generated/pandas.Index.html


0
投票

我理解,通过“严格”增加,你的意思是这些值是整数,并且邻居之间的间隔正好是 1?正如here所讨论的,这是检查命名标准的简单方法: def is_coherent(seq): return seq == range(seq[0], seq[-1]+1)

将其与 
my_df

的第一列一起使用可能如下所示:


is_coherent(my_df[0].tolist())



0
投票

diff = df[0] - df[0].shift(1) is_monotonic = (diff < 0).sum() == 0 or (diff > 0).sum() == 0

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

编辑:既然你只想严格增加,那么它就是:<= 0.

is_monotonic = (diff <= 0).sum() == 0

© www.soinside.com 2019 - 2024. All rights reserved.