pytest断言一个列是在另一个已经排序的组中是升序还是降序

问题描述

我正在运行以下代码

import numpy as np
import pandas as pd

dfTestExample = pd.DataFrame(np.random.randint(0,100,size=(1000,4)),columns=list('ABCD'))

dfTestExample = dfTestExample.sort_values(["A","B"],ascending = [True,False])

dfTestExample.head(10)

产生

    A   B   C   D
303 0   84  13  96
728 0   43  48  32
558 0   35  49  49
286 0   34  17  4
652 0   29  53  4
292 0   18  62  29
139 0   17  63  99
718 1   91  6   48
611 1   83  19  75
208 1   80  35  73
dfTestExample.A.is_monotonic
True
dfTestExample.B.is_monotonic
False

如何检查A的所有值的B列是否也是蒙脱性的?

解决方法

对于每个groupby的值,您可以使用A将数据框分为不同的组:

monotonic = True
for group in df.groupby(['A']):
    b = group[1].B
    if not b.is_monotonic and not b.is_monotonic_decreasing:
        monotonic = False
print(monotonic)

groupby给您一个DataFrameGroupBy对象。如果在该对象上进行迭代,则会得到index和DataFrame对象的元组,并且可以分别处理它们。在您的情况下,分组的DataFrame对象看起来像:

    A   B   C   D
303 0   84  13  96
728 0   43  48  32
558 0   35  49  49
286 0   34  17  4
652 0   29  53  4
292 0   18  62  29
139 0   17  63  99

和:

    A   B   C   D
718 1   91  6   48
611 1   83  19  75
208 1   80  35  73

请注意,如果您想知道数据集是单调递增还是递减,则必须同时检查两者,如示例所示。