提取有序数据帧列值递减的行
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]
我有一个数据框,其中包含有关建筑物、它们的状态以及记录状态的时间的信息。
为了简单起见,我在这个例子中将它们编码成数字 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]