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

如何在Julia中计算DataFrame与最近条件值的行差?

问题描述

给定如下Julia DataFrame:

using DataFrames

df = DataFrame(
    condition = [false, false, true, false, false, false, true, false, false, false],
    time = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
)

原始输出为:

10×2 DataFrame
 Row │ condition  time  
     │ Bool       Int64 
─────┼──────────────────
   1 │     false      1
   2 │     false      2
   3 │      true      3
   4 │     false      4
   5 │     false      5
   6 │     false      6
   7 │      true      7
   8 │     false      8
   9 │     false      9
  10 │     false     10

需要为每行计算与最近的condition=true行的time差值(condition=true的行差值为0),期望输出如下:

10×3 DataFrame
 Row │ condition  time   diff  
     │ Bool       Int64  Int64 
─────┼─────────────────────────
   1 │     false      1      2
   2 │     false      2      1
   3 │      true      3      0
   4 │     false      4      1
   5 │     false      5      2
   6 │     false      6      1
   7 │      true      7      0
   8 │     false      8      1
   9 │     false      9      2
  10 │     false     10      3
解决方案

方法一:遍历计算最小绝对差

直观易懂,适合小规模数据集:

# 提取所有condition为true的time值
true_times = df.time[df.condition]

# 为每行计算到最近true行的time差值
df.diff = [minimum(abs(t - t_true) for t_true in true_times) for t in df.time]

方法二:二分查找优化(适合大数据集)

当condition=true的行数量较多时,使用二分查找可避免遍历所有true行,提升效率:

# 提取所有condition为true的time值(原始数据time递增,无需额外排序)
true_times = df.time[df.condition]

# 定义函数:通过二分查找定位最近的true行,计算差值
function nearest_time_diff(t, true_times)
    idx = searchsortedfirst(true_times, t)
    candidates = Int[]
    # 检查前一个true行
    idx > 1 && push!(candidates, t - true_times[idx-1])
    # 检查后一个true行
    idx <= length(true_times) && push!(candidates, true_times[idx] - t)
    return minimum(candidates)
end

# 应用函数到每行time
df.diff = [nearest_time_diff(t, true_times) for t in df.time]

两种方法均可得到符合要求的结果,方法二更适合处理行数较多的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:15:36