我有一个数据帧,其中包含有关建筑物、其状态以及记录状态的时间的信息。
为了简单起见,我在这个示例表中将它们编码为数字:
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";,则groupby
it;"状态";条目,并查看是否有任何值小于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]