Python pandas按日期升序筛选、按value分组去重取最新记录实现
问题解答
现有实现的正确性判断
你当前的代码实现不正确,存在两处问题:
- 字段名不匹配:原始CSV文件的日期字段名为
Date-Time,你代码中直接调用df["date"]会抛出字段不存在的报错,需要先对应到正确的字段名。 - 排序逻辑不符合需求:
sort_values("date")默认按时间升序排列,每组时间最早的记录会排在最前面,此时调用groupby().first()取到的是每组最早的记录,和你要取「最新时间记录」的需求完全相反。
修正后的原思路实现
如果要沿用你现有的排序+分组取数的思路,调整后代码如下:
# 转换原始日期字段为datetime格式 df["Date-Time"] = pd.to_datetime(df["Date-Time"]) # 按日期降序排列,每组最新的记录排在最前 df = df.sort_values("Date-Time", ascending=False).groupby(['value'], as_index=False).first() # 重命名字段符合输出要求 df = df.rename(columns={"Date-Time": "date"}) print(df)
更优实现方案
推荐使用idxmax()方案,不需要全表排序,大数据量下性能提升非常明显:
import pandas as pd # 转换日期字段格式 df["Date-Time"] = pd.to_datetime(df["Date-Time"]) # 直接取每个value分组下日期最大值对应的行索引,筛选对应行 df = df.loc[df.groupby("value")["Date-Time"].idxmax()].reset_index(drop=True) # 重命名日期字段 df = df.rename(columns={"Date-Time": "date"}) print(df)
该方案避免了全表排序的高时间开销,同时也不会因为排序方向设置错误导致结果异常,稳定性和性能都更优。
内容的提问来源于stack exchange,提问作者madhavi
相关产品推荐
相关产品推荐

