[英]Check if specific values in column follow each other for each id
我有以下 dataframe
id | status
____________
1 | reserved
2 | signed
1 | waiting
1 | signed
3 | waiting
2 | sold
3 | reserved
1 | sold
我想验证一个假设,即状态reserved
、 waiting
、 signed
总是导致状态sold
。 我只需要检查以下顺序,可能会省略一些状态,例如 dataframe 中的id == 2
。
我想知道是否有办法查找按 id dataframe 分组的下一行值
预期的 output 是 dataframe 或遵循上述规则的id
列表。 对于上面的 dataframe 它将是这样的:
id
__
1
2
我的尝试是获取所有具有这些状态的唯一id
,然后为每个id
找到它的状态列表。 然后我想以某种方式过滤它,但有很多组合。
df = df[df.status.isin(['reserved', 'waiting', 'signed', 'sold'])]
df1 = df.groupby('flat_id').['status'].unique()
df1.where('status'== [''reserved', 'waiting', 'signed', 'sold'']
or ['reserved', 'waiting', 'sold'] ... )
IIUC,您只想检查“已售出”是每组的最后一个值:
m = df.groupby('id')['status'].apply(lambda s: s.iloc[-1] == 'sold')
out = m[m].index.tolist()
output: [1, 2]
如果您想确保在“出售”之前有一些东西:
m = df.groupby('id')['status'].apply(lambda s: len(s)>1 and s.iloc[-1] == 'sold')
如果你想确保这个东西在一个特定的列表中:
m = df.groupby('id')['status'].apply(lambda s: s.isin(['reserved', 'waiting', 'signed']).any()
and s.iloc[-1] == 'sold')
m[m].index.tolist()
(df.drop_duplicates('id', keep='last')
.loc[lambda d: d['status'].eq('sold'), 'id']
)
output:
5 2
7 1
Name: id, dtype: int64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.