繁体   English   中英

检查每个 id 列中的特定值是否相互跟随

[英]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

我想验证一个假设,即状态reservedwaitingsigned总是导致状态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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM