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)
可能是最好的方式是,以获得数据帧列作为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)
你可以计算一下这个:
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)
| 归档时间: |
|
| 查看次数: |
6792 次 |
| 最近记录: |