提取有序数据帧列值递减的行

Extract the rows with decreasing values of column of an ordered dataframe

我有一个数据框,其中包含有关建筑物、它们的状态以及记录状态的时间的信息。

为了简单起见,我在这个例子中将它们编码成数字 table:

id time status
101 1 1
101 2 2
101 3 3
102 1 2
102 2 1
102 3 2
102 4 3

我想提取状态不严格递增的 ID。我的意思是他们的状态应该总是随着时间的增加而增加,就像 ID 101

如您所见,ID 102 在时间 1 的状态为 2,但在时间 2 的状态为 1。

因此,如果您将此 table 提供给函数,它应该 return 一个仅包含 102 的 ID 列表。

提前致谢!

在一个 groupby lambda 函数中获取每个 id 的差异(为了避免双重 groupby)以进行检查,如果所有值都大于 0 并且列表过滤器索引具有倒置值不匹配条件的掩码:

#if necessary sorting per id and time
df = df.sort_values(['id','time'])

s = df.groupby('id')['status'].apply(lambda x: np.all(np.diff(x) > 0))

L = s.index[~s].tolist()
print (L)
[102]

如果需要行使用GroupBy.transform for possible filter in boolean indexing:

#if necessary sorting per id and time
df = df.sort_values(['id','time'])

df1 = df[~df.groupby('id')['status'].transform(lambda x: np.all(np.diff(x) > 0))]
print (df1)
    id  time  status
3  102     1       2
4  102     2       1
5  102     3       2
6  102     4       3

这是一种方法:set_index到“id”,然后groupby它,在连续的“status”条目中找到差异,看看是否有任何值小于 0;这将创建一个布尔系列,其中任何负值为 True。然后再次groupby“id”,看看是否有任何“id”为负值;这也创建了一个布尔系列。用值过滤系列的索引。

msk = df.set_index('id').groupby(level=0)['status'].diff().le(0).groupby(level=0).any()
out = msk[msk].index.tolist()

输出:

[102]