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



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

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

id 时间 状态
101 1 1
101 2 2
101 3 3
102 2
102 2 1
102 3 2
102 4 3

如果所有值都像0一样大,则在lambda函数中的一个groupby中获取每个id的差分(用于避免双重groupby(进行检查,并且对于值不匹配的具有反向掩码的列表过滤器索引条件:

#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作为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";,则groupbyit;"状态";条目,并查看是否有任何值小于0;这将创建一个布尔级数,其中任何负值都为True。然后按";id";再看是否有";id";具有负值;这也创建了一个布尔级数。使用其值筛选序列的索引。

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

输出:

[102]

最新更新