如何用Pandas筛选出在所有唯一日期都登录的用户
解决步骤
1. 移除用户单日重复登录记录
用drop_duplicates()方法,指定按User和Date列去重,确保每个用户每天仅保留一条记录:
import pandas as pd # 构造原始DataFrame data = { 'Date': ['01/01/23', '01/01/23', '01/03/23', '02/03/23', '01/03/23', '01/02/23'], 'User': ['Tom', 'Tom', 'Andrew', 'Andrew', 'Barry', 'Andrew'] } df = pd.DataFrame(data) # 去重操作:保留每个用户每天的第一条记录 df_unique = df.drop_duplicates(subset=['User', 'Date'], keep='first')
去重后的中间结果:
| Date | User |
|---|---|
| 01/01/23 | Tom |
| 01/03/23 | Andrew |
| 02/03/23 | Andrew |
| 01/03/23 | Barry |
| 01/02/23 | Andrew |
2. 筛选全日期登录的用户
先统计所有唯一日期的总数,再筛选出登录日期数等于总日期数的用户,最后过滤出对应记录:
# 计算所有唯一日期的数量 total_dates = df_unique['Date'].nunique() # 筛选出在所有日期都登录的用户 valid_users = df_unique.groupby('User')['Date'].nunique() == total_dates valid_users_list = valid_users[valid_users].index.tolist() # 得到最终结果 final_df = df_unique[df_unique['User'].isin(valid_users_list)]
最终结果和预期一致:
| Date | User |
|---|---|
| 01/03/23 | Andrew |
| 02/03/23 | Andrew |
| 01/02/23 | Andrew |
如果想简化成一行代码(可读性稍弱):
final_df = df.drop_duplicates(subset=['User', 'Date']).groupby('User').filter(lambda x: x['Date'].nunique() == df['Date'].nunique())
内容的提问来源于stack exchange,提问作者thenoob
相关产品推荐
相关产品推荐

