如何用Pandas统计存在非发布浏览职位的唯一account_id数量
问题描述
我有一个包含account_id、viewed_job_id和posted_job_id列的Pandas DataFrame,每行数据唯一,但同一个account_id会出现在多行中。需要统计满足存在至少一个viewed_job_id不在该账户所有posted_job_id集合中的唯一account_id数量。
示例数据
| account_id | viewed_job_id | posted_job_id |
|---|---|---|
| a_1 | j_1 | j_2 |
| a_1 | j_2 | j_1 |
| a_2 | j_1 | j_4 |
| a_2 | j_3 | j_1 |
| a_3 | j_2 | j_3 |
| a_3 | j_3 | j_3 |
示例结果:满足条件的账户为a_2和a_3,最终统计数量为2。
解决方案
实现步骤
- 按
account_id分组,分别提取每个账户的所有viewed_job_id和posted_job_id并去重为集合 - 检查每个账户的浏览岗位集合是否不完全包含在发布岗位集合中(即存在至少一个浏览岗位不在发布岗位里)
- 统计满足条件的账户总数
代码实现
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的数据) df = pd.DataFrame({ 'account_id': ['a_1', 'a_1', 'a_2', 'a_2', 'a_3', 'a_3'], 'viewed_job_id': ['j_1', 'j_2', 'j_1', 'j_3', 'j_2', 'j_3'], 'posted_job_id': ['j_2', 'j_1', 'j_4', 'j_1', 'j_3', 'j_3'] }) # 分组聚合得到每个账户的岗位集合 account_job_sets = df.groupby('account_id').agg( viewed=('viewed_job_id', set), posted=('posted_job_id', set) ) # 判断每个账户是否符合条件 account_job_sets['is_valid'] = account_job_sets.apply( lambda row: not row['viewed'].issubset(row['posted']), axis=1 ) # 统计符合条件的账户数量 valid_account_count = account_job_sets['is_valid'].sum() print(valid_account_count) # 输出:2
代码说明
groupby('account_id').agg(...):通过分组聚合,用set自动去重,得到每个账户的所有浏览岗位和发布岗位集合row['viewed'].issubset(row['posted']):判断浏览岗位是否全在发布岗位里,取反后就表示存在至少一个浏览岗位不在发布岗位集合中sum():布尔值求和时,True会被当作1,False当作0,直接得到满足条件的账户数量
内容的提问来源于stack exchange,提问作者Kevin Sun
相关产品推荐
相关产品推荐

