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

时间:2015-01-22 16:06:53

标签: python pandas data-analysis

我可以使用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

5 个答案:

答案 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())