如何提取Pandas数据中各ID状态的最后变更日期?
解决Pandas提取每个ID最新状态及变更日期的问题
当你尝试用groupby直接取change_date最大值时,往往无法关联到对应的state——因为单独聚合日期时,状态列会被独立处理,导致日期和状态不匹配。下面是两种可靠的实现方式:
方法1:排序后去重
先按ID分组,再对change_date降序排序,保留每个ID的第一行数据,这一行就是该ID最新的状态和变更日期。
import pandas as pd # 构造示例数据 data = { 'ID': [1, 1, 2, 2, 3], 'state': ['active', 'inactive', 'pending', 'active', 'inactive'], 'change_date': ['2023-04-10 09:30:00', '2023-04-11 14:20:00', '2023-04-12 10:15:00', '2023-04-12 11:00:40', '2023-04-09 08:00:00'] } df = pd.DataFrame(data) # 转换日期格式(如果原始数据不是datetime类型) df['change_date'] = pd.to_datetime(df['change_date']) # 排序并去重 result = df.sort_values(['ID', 'change_date'], ascending=[True, False]) \ .drop_duplicates(subset='ID', keep='first') \ .reset_index(drop=True) print(result)
方法2:使用idxmax获取最大日期的索引
通过groupby找到每个ID对应change_date最大值的索引,再用loc提取对应行数据。
# 确保日期格式正确 df['change_date'] = pd.to_datetime(df['change_date']) # 获取每个ID的最大change_date对应的索引 max_date_idx = df.groupby('ID')['change_date'].idxmax() # 提取目标行 result = df.loc[max_date_idx].reset_index(drop=True) print(result)
为什么直接groupby取max不可行?
如果你直接执行
df.groupby('ID').max(),Pandas会对每个列独立聚合:change_date会取最大值,但state会取字符串排序后的最大值(比如'inactive'比'active'优先级高),这会导致状态和最新变更日期不匹配,因此这种方法不能用。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

