如何在Julia中按分组计算DataFrame连续行的差值?
问题描述
我创建了如下名为df的DataFrame:
using DataFrames df = DataFrame(group = ["A", "A", "A", "A", "B", "B", "B", "B"], value = [2,1,4,3,3,5,2,1])
对应的输出为:
8×2 DataFrame Row │ group value │ String Int64 ─────┼─────────────── 1 │ A 2 2 │ A 1 3 │ A 4 4 │ A 3 5 │ B 3 6 │ B 5 7 │ B 2 8 │ B 1
我需要按group分组,计算value列中连续行与前一行的差值,每组首行填充NaN,期望输出如下:
8×3 DataFrame Row │ group value diff │ String Int64 Float64 ─────┼──────────────────────── 1 │ A 2 NaN 2 │ A 1 -1.0 3 │ A 4 3.0 4 │ A 3 -1.0 5 │ B 3 NaN 6 │ B 5 2.0 7 │ B 2 -3.0 8 │ B 1 -2.0
解决方案
可以借助DataFrames的分组功能结合transform和diff函数实现需求:
using DataFrames transform(groupby(df, :group), :value => (x -> vcat(NaN, diff(x))) => :diff)
代码说明
groupby(df, :group):按group列对DataFrame完成分组:value => (x -> vcat(NaN, diff(x))) => :diff:针对每个分组的value列执行操作:diff(x)计算当前行与前一行的差值,返回数组长度比原分组少1vcat(NaN, diff(x))在差值数组头部添加NaN,对应每组的首行空缺值- 最终将处理结果命名为
diff列,合并回原DataFrame
执行上述代码后即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

