我可以使用 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
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
可能最好的方法是获取数据帧列作为 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:]))
如果两个索引相等,它们不会是唯一的。所以你可以使用:
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
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