如何在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
相关产品推荐
相关产品推荐

