Julia DataFrames 中是否有 diff() 函数,比如 Pandas?

con*_*449 8 dataframe julia

我在 Julia 中有一个 DataFrame,我想创建一个新列来表示特定列中连续行之间的差异。在 python 熊猫中,我会简单地使用df.series.diff(). 有 Julia 等效项吗?

例如:

data
1
2
4
6
7

# in pandas

df['diff_data'] = df.data.diff()

data   diff_data
1        NaN 
2          1
4          2
6          2
7          1
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 9

您可以像这样使用 ShiftedArrays.jl。

声明风格:

julia> using DataFrames, ShiftedArrays

julia> df = DataFrame(data=[1, 2, 4, 6, 7])
5×1 DataFrame
 Row ? data
     ? Int64
?????????????
   1 ?     1
   2 ?     2
   3 ?     4
   4 ?     6
   5 ?     7

julia> transform(df, :data => (x -> x - lag(x)) => :data_diff)
5×2 DataFrame
 Row ? data   data_diff
     ? Int64  Int64?
????????????????????????
   1 ?     1    missing
   2 ?     2          1
   3 ?     4          2
   4 ?     6          2
   5 ?     7          1
Run Code Online (Sandbox Code Playgroud)

命令式(到位):

julia> df = DataFrame(data=[1, 2, 4, 6, 7])
5×1 DataFrame
 Row ? data
     ? Int64
?????????????
   1 ?     1
   2 ?     2
   3 ?     4
   4 ?     6
   5 ?     7

julia> df.data_diff = df.data - lag(df.data)
5-element Vector{Union{Missing, Int64}}:
  missing
 1
 2
 2
 1

julia> df
5×2 DataFrame
 Row ? data   data_diff
     ? Int64  Int64?
????????????????????????
   1 ?     1    missing
   2 ?     2          1
   3 ?     4          2
   4 ?     6          2
   5 ?     7          1
Run Code Online (Sandbox Code Playgroud)

diff你不需要额外的软件包,可以做同样的情况如下:

julia> df.data_diff = [missing; diff(df.data)]
5-element Vector{Union{Missing, Int64}}:
  missing
 1
 2
 2
 1
Run Code Online (Sandbox Code Playgroud)

(问题是这diff是一个通用函数,它确实将向量的长度从 更改为nn-1因此您必须missing在前面手动添加)

  • 除了 Bogumil 的这个很棒的答案之外,您可能还对 TimeSeries.jl 包感兴趣,它具有包含时间的特殊列的“数据帧”。它们也有滞后函数:https://juliastats.org/TimeSeries.jl/stable/apply/#lag-1 (2认同)