Python pandas如何基于时间获取DataFrame产品列最新记录状态
需求说明
现有如下结构的DataFrame:
需要获取product列对应各产品最新一条记录的status状态,原有实现代码如下:
for i in df["product"]: process_status = df[df.Processid == i].status.to_string(index=False) if process_status=="pass": print("green") if process_status=="fail": print("red")
原有代码未基于时间维度做筛选,无法获取最新数据对应的状态。
实现方案
第一步先确认时间列格式,必须转为pandas支持的datetime类型才能正确排序/比较大小,将代码里的time_col替换为你表中实际存储记录时间的列名即可:
import pandas as pd df['time_col'] = pd.to_datetime(df['time_col'])
方案1:排序后去重(写法简洁,性能好)
先按时间倒序排列所有记录,同产品的最新记录会排在最前,之后按产品去重仅保留第一条记录,就能得到每个产品的最新状态,不需要写冗余循环:
# 按记录时间倒序排序,最新的记录排在最前 df_sorted = df.sort_values(by='time_col', ascending=False) # 按产品去重,每个产品仅保留第一条(最新)记录,提取产品和状态两列 latest_record = df_sorted.drop_duplicates(subset='product', keep='first')[['product', 'status']] # 输出对应颜色标识 for _, item in latest_record.iterrows(): if item['status'] == 'pass': print(f"{item['product']}: green") elif item['status'] == 'fail': print(f"{item['product']}: red")
方案2:分组取时间最大值对应行
按产品分组,直接定位每个产品对应时间最大的行索引,提取对应记录:
# 取每个产品分组下时间最大的行索引 latest_index = df.groupby('product')['time_col'].idxmax() latest_record = df.loc[latest_index, ['product', 'status']] # 后续颜色输出逻辑和方案1完全一致
原有代码存在两个明显问题:一是筛选条件写错了列,按产品匹配应该筛选
product列而非Processid列;二是直接遍历全量product列做匹配会产生大量重复计算,数据量较大时运行效率极低,不推荐这种写法。
内容的提问来源于stack exchange,提问作者Akshay Lokhande
相关产品推荐
相关产品推荐

