我可以使用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
答案 0 :(得分:11)
Pandas 0.19 添加了一个公开的Series.is_monotonic
API(之前,这只在未记录的algos
模块中提供)。
(已更新)请注意,尽管名称如此,Series.is_monotonic
仅指示系列是否单调增加(相当于使用Series.is_monotonic_increasing
)。反过来说,使用Series.is_monotonic_decreasing
。
无论如何,两者都是非严格的,但你可以将它们与is_unqiue
结合起来以获得严格性。
e.g:
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
答案 1 :(得分:5)
可能最好的方法是将数据帧列作为numpy数组获取而不复制数据(通过索引选择列后使用the .values
property),然后使用基于numpy的测试来检查单调性:
def monotonic(x):
return np.all(np.diff(x) > 0)
monotonic(df[0].values)
纯粹的Python实现,借鉴于此:Python - How to check list monotonicity
def strictly_increasing(L):
return all(x<y for x, y in zip(L, L[1:]))
答案 2 :(得分:1)
如果两个指数相等,它们将不是唯一的。所以你可以使用:
my_df.Index.is_monotonic and my_df.Index.is_unique
这些属性记录在15.2版中; is_unique在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
答案 3 :(得分:0)
你可以算一下这个:
diff = df[0] - df[0].shift(1)
is_monotonic = (diff < 0).sum() == 0 or (diff > 0).sum() == 0
你在这里检查的是差异都是&gt; = 0或者所有&lt; = 0。
编辑:因为你只想要严格增加,所以它只是:
is_monotonic = (diff <= 0).sum() == 0
答案 4 :(得分:0)
据我所知,通过严格增加你的意思是值是整数而且邻居正好是1?正如here所讨论的,这是一种检查命名标准的简单方法:
def is_coherent(seq):
return seq == range(seq[0], seq[-1]+1)
将其与my_df
的第一列一起使用可能如下所示:
is_coherent(my_df[0].tolist())