You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DataFrames.jl时如何对比前序行筛选出日期单调递增的行?

Julia DataFrames.jl 实现保留日期单调递增行的方法

实现思路

你的判断是正确的:filter仅支持单行级别的判断,无法满足依赖历史保留数据状态的过滤需求;subset支持传入整列数据处理,刚好适配该场景。

代码实现

方法1:自定义掩码函数+subset(推荐,性能最优可读性最高)

Julia的原生for循环性能极高,完全不需要担心循环带来的性能损耗,自定义掩码函数逻辑清晰易懂:

using DataFrames, Dates

# 生成严格单调递增序列的布尔掩码
function get_strict_increase_mask(col::AbstractVector{T}) where T<:Union{Date, DateTime}
    n = length(col)
    mask = falses(n)
    n == 0 && return mask
    # 初始化第一行必保留
    current_max = col[1]
    mask[1] = true
    @inbounds for i in 2:n
        if col[i] > current_max
            mask[i] = true
            current_max = col[i]
        end
    end
    return mask
end

# 直接调用subset筛选即可
filtered_df = subset(dfl, :Date => get_strict_increase_mask)

方法2:使用accumulate一行实现(高阶函数写法)

如果不想单独写函数,可以用accumulate累计状态一行实现:

filtered_df = subset(dfl, :Date => d -> accumulate(
    (last_max, curr) -> curr > last_max ? curr : last_max,
    d;
    init=typemin(eltype(d))
) .== d)

效果验证

对你给出的前20行测试数据运行上述代码,输出结果和你预期的5行结果完全一致。

补充说明

你完全可以直接用类似Python的遍历逻辑实现,Julia的for循环运行效率和C相当,哪怕是处理百万级行的DataFrame也不会有性能问题,不需要刻意追求高阶函数写法牺牲可读性。

内容的提问来源于stack exchange,提问作者Jethro Cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:36:06