如何在Pandas中筛选仅含特定status_id的用户数据行?
解决方法:筛选仅拥有特定status_id的用户数据
嘿,这问题我熟!要找出那些只拥有特定status_id、完全没有其他状态的用户的所有数据行,咱们用Pandas就能轻松实现,一步步来:
原始数据
先看一下你的原始DataFrame:
| user_id | status_id | date_created |
|---|---|---|
| 1 | 1 | 2018-02-14 11:49:07.429000-02:00 |
| 1 | 4 | 2018-02-19 12:51:43.622000-03:00 |
| 1 | 3 | 2018-02-15 09:21:23.116000-02:00 |
| 2 | 3 | 2018-02-19 12:52:08.646000-03:00 |
| 3 | 3 | 2016-08-29 11:02:39.449000-03:00 |
| 4 | 4 | 2016-08-29 11:18:31.742000-03:00 |
| 4 | 2 | 2018-02-21 10:43:45.747000-03:00 |
| 5 | 3 | 2018-02-15 09:34:57.478000-02:00 |
| 5 | 2 | 2018-02-19 11:52:16.629000-03:00 |
比如当目标是筛选status_id=3时,我们只需要保留user_id为2和3的行——因为这两个用户的状态里只有3,没有其他值。
代码实现
下面是完整的Pandas代码,直接就能用:
import pandas as pd # 构造原始DataFrame(如果你的数据已经加载好,这部分可以跳过) data = { 'user_id': [1,1,1,2,3,4,4,5,5], 'status_id': [1,4,3,3,3,4,2,3,2], 'date_created': [ '2018-02-14 11:49:07.429000-02:00', '2018-02-19 12:51:43.622000-03:00', '2018-02-15 09:21:23.116000-02:00', '2018-02-19 12:52:08.646000-03:00', '2016-08-29 11:02:39.449000-03:00', '2016-08-29 11:18:31.742000-03:00', '2018-02-21 10:43:45.747000-03:00', '2018-02-15 09:34:57.478000-02:00', '2018-02-19 11:52:16.629000-03:00' ] } df = pd.DataFrame(data) # 定义你要筛选的目标status_id target_status = 3 # 1. 分组计算每个用户的所有唯一status_id user_unique_statuses = df.groupby('user_id')['status_id'].unique() # 2. 筛选出仅包含目标status的用户ID valid_users = user_unique_statuses[ user_unique_statuses.apply(lambda x: len(x) == 1 and x[0] == target_status) ].index # 3. 用符合条件的用户ID过滤原DataFrame result_df = df[df['user_id'].isin(valid_users)] # 查看结果 print(result_df)
运行结果
执行代码后,你会得到想要的筛选结果:
user_id status_id date_created 3 2 3 2018-02-19 12:52:08.646000-03:00 4 3 3 2016-08-29 11:02:39.449000-03:00
逻辑说明
简单解释下每一步的作用:
- 分组后,我们能得到每个用户对应的所有唯一status_id列表,比如user_id1的列表是
[1,4,3],而user_id2的是[3] - 通过判断列表长度是否为1,且唯一元素等于目标status,就能精准找出“只有该状态”的用户
- 最后用这些用户ID过滤原表,就拿到了这些用户的所有数据行
如果要筛选其他status_id,只要修改target_status的值就行啦!
内容的提问来源于stack exchange,提问作者Alexandre Lara
相关产品推荐
相关产品推荐

