Pandas如何按用户分组筛选各用户最早观影日期对应的影片及日期记录
实现方法
首先先把Date列转换为 pandas 可识别的时间格式,避免字符串排序出现异常:
import pandas as pd # 你的原始数据 watched_df = pd.DataFrame([['Love Death Robots', '2016-01-29 14:04:22', 'Anna'], ['James Bond', '2016-02-29 14:04:22', 'Anna'], ['Lord of the Rings', '2016-09-29 14:04:22', 'BoB'], ['The Hobbit', '2016-10-29 14:04:22', 'Anna'], ['Beauty and the Beast', '2016-06-29 14:04:22', 'BoB']], columns=['Title', 'Date', 'Profile_Name']) # 转换时间格式 watched_df['Date'] = pd.to_datetime(watched_df['Date'])
方法1:排序后去重(最简便)
按Date升序排序后,按Profile_Name字段去重,保留首次出现的记录即可:
wanted_df = watched_df.sort_values('Date').drop_duplicates('Profile_Name', keep='first')
方法2:基于分组取最小时间的索引
直接通过分组定位最早记录的行索引,直接取对应行即可:
# 取每个用户最早观影记录的行索引 min_date_idx = watched_df.groupby('Profile_Name')['Date'].idxmin() # 按索引取对应行 wanted_df = watched_df.loc[min_date_idx].reset_index(drop=True)
方法3:匹配已有最小日期表
如果你已经提前生成了各用户对应最早观影日期的df(以Profile_Name为索引、Date为值,假设命名为min_date_df),可以直接用merge关联拿到对应Title:
wanted_df = watched_df.merge(min_date_df.reset_index(), on=['Profile_Name', 'Date'])
以上三种方法输出的结果都和你预期的一致,如果需要保留原始索引可以去掉reset_index部分。
内容的提问来源于stack exchange,提问作者Sebastian ten Berge
相关产品推荐
相关产品推荐

