2026a

# transform!


不复制新的表格对列进行转换,行数不变并保留原列

函数库: DataFrames

# 语法

  transform!(df::AbstractDataFrame, args...; renamecols::Bool=true)
  transform!(args::Callable, df::AbstractDataFrame; renamecols::Bool=true)
  transform!(gd::GroupedDataFrame, args...; ungroup::Bool=true, renamecols::Bool=true)
  transform!(f::Base.Callable, gd::GroupedDataFrame; ungroup::Bool=true, renamecols::Bool=true)

# 说明

transform!函数用法与selct基本相同,差别在于transform!是在原有表格基础上进行操作,并不会复制新的表格

transform!(df::AbstractDataFrame, args...; renamecols::Bool=true) 在原表上进行操作,其中包含来自 df 的列以及由 args 指定的列并返回它。 结果保证与 df 具有相同的行数,相当于select!,但会保留原有的列。 示例


transform!(args::Callable, df::AbstractDataFrame; renamecols::Bool=true)对表格df应用方法args,行数不变,并会保留原有的列。示例


transform!(gd::GroupedDataFrame, args...; ungroup::Bool=true, renamecols::Bool=true)在原表df上进行转换,其中包含来自 args 指定的 分组表格 gd 的列并返回它。行数不变,相当于select!,但会保留原有的列。示例


transform!(f::Base.Callable, gd::GroupedDataFrame; ungroup::Bool=true, renamecols::Bool=true)对分组表格gd应用方法f,行数不变,并会保留原有的列。

# 示例

对列使用函数
using DataFrames
df = DataFrame(a=1:3, b=4:6)
df = 3×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      4
   2 │     2      5
   3 │     3      6

对:a列求sin并改名为:c,同时transform!会保留原有的列

transform!(df, :a => ByRow(sin) => :c, :b)
ans =  3×3 DataFrame
 Row │ a      b      c
     │ Int64  Int64  Float64
─────┼────────────────────────
   1 │     1      4  0.841471
   2 │     2      5  0.909297
   3 │     3      6  0.14112

对两列使用二元函数并创建新列

transform!(df, :, [:a, :b] => (a, b) -> a .+ b .- sum(b)/length(b))
ans = 3×4 DataFrame
 Row │ a      b      c         a_b_function
     │ Int64  Int64  Float64   Float64
─────┼──────────────────────────────────────
   1 │     1      4  0.841471           0.0
   2 │     2      5  0.909297           2.0
   3 │     3      6  0.14112            4.0
对行使用函数
using TyBase
using TyMath
using DataFrames
df1 = DataFrame(a=1:3, b=4:6)
df1 = 3×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      4
   2 │     2      5
   3 │     3      6

求每行的平均值 AsTable(cols)用于选择源位置,则表示由换行选择的列选择器 cols 应该作为 NamedTuple 传递给函数。AsTable(:)表示选择所有列

transform!(df1, AsTable(:) => ByRow(mean), renamecols=false)
ans = 3×3 DataFrame
 Row │ a      b      a_b
     │ Int64  Int64  Float64
─────┼───────────────────────
   1 │     1      4      2.5
   2 │     2      5      3.5
   3 │     3      6      4.5

创建另一个表格

df2 = DataFrame(a=1:3, b=4:6, c=7:9)
df2 = 3×3 DataFrame
 Row │ a      b      c
     │ Int64  Int64  Int64
─────┼─────────────────────
   1 │     1      4      7
   2 │     2      5      8
   3 │     3      6      9

计算行的统计量

transform!(df2, AsTable(:) => ByRow(x -> (mean=mean(x), std=std(x))) => :stats,
        AsTable(:) => ByRow(x -> (mean=mean(x), std=std(x))) => AsTable)
ans = 3×6 DataFrame
 Row │ a      b      c      stats                    mean     std
     │ Int64  Int64  Int64  NamedTup…                Float64  Float64
─────┼────────────────────────────────────────────────────────────────
   1 │     1      4      7  (mean = 4.0, std = 3.0)      4.0      3.0
   2 │     2      5      8  (mean = 5.0, std = 3.0)      5.0      3.0
   3 │     3      6      9  (mean = 6.0, std = 3.0)      6.0      3.0
对表应用函数
using TyBase
using TyMath
using DataFrames
df = DataFrame(a=1:3, b=4:6)
df = 3×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      4
   2 │     2      5
   3 │     3      6
transform!(first,df)
ans = 3×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      4
   2 │     1      4
   3 │     1      4
对分组表格使用函数

创建一个表格并由 a 分组

using TyBase
using TyMath
using DataFrames
df = DataFrame(a=repeat([1, 2, 3, 4], outer=[2]),
b=repeat([2, 1], outer=[4]),
c=1:8)
gd = groupby(df, :a)
gd = GroupedDataFrame with 4 groups based on key: a
First Group (2 rows): a = 1
 Row │ a      b      c
     │ Int64  Int64  Int64
─────┼─────────────────────
   1 │     1      2      1
   2 │     1      2      5
   ⋮
Last Group (2 rows): a = 4
 Row │ a      b      c
     │ Int64  Int64  Int64
─────┼─────────────────────
   1 │     4      1      4
   2 │     4      1      8

对:b,:c列改名并求和

transform!(gd, :b => :b1, :c => :c1, [:b, :c] => +)
ans =  8×6 DataFrame
 Row │ a      b      c      b1     c1     b_c_+
     │ Int64  Int64  Int64  Int64  Int64  Int64
─────┼──────────────────────────────────────────
   1 │     1      2      1      2      1      3
   2 │     2      1      2      1      2      3
   3 │     3      2      3      2      3      5
   4 │     4      1      4      1      4      5
   5 │     1      2      5      2      5      7
   6 │     2      1      6      1      6      7
   7 │     3      2      7      2      7      9
   8 │     4      1      8      1      8      9

# 输入参数

df-输入
表格

输入参数,为表格

args-输入

对表格进行操作的函数,可以为以下方式

  1. 标准列选择器:整数、符号、字符串、整数向量、符号向量、字符串向量、All、Cols、:、Between、Not 和 正则表达式

  2. cols => function:指示应该使用包含列 cols 的位置参数调用函数,该列可以是任何有效的列选择器; 在这种情况下,目标列名称是自动生成的,并且假定函数返回单个值或向量; 默认情况下,通过连接源列名和函数名来创建生成的名称。

  3. cols => function => target_cols:另外明确指定目标列或列,它必须是单个名称(作为符号或字符串)、名称向量或 AsTable。 此外,它可以是一个函数,它将字符串或字符串向量作为包含由 cols 选择的列名称的参数,并返回目标列名称(允许除 AsTable 之外的所有接受类型)。

  4. col => target_cols :它将列 col 重命名为 target_cols,它必须是单个名称(作为符号或字符串)、名称向量或 AsTable。

  5. nrow 或 nrow => target_cols 形式:可有效计算组中的行数; 没有 target_cols 新列称为 :nrow,否则它必须是单一名称(作为符号或字符串)。

  6. 包含由点 2 到 5 中描述的 Pair 语法指定的变换的向量或矩阵

  7. 如果处理 GroupedDataFrame,则将使用与每个组对应的 SubDataFrame 调用函数,如果处理 AbstractDataFrame,则使用数据帧本身调用该函数; 应该避免这种形式,因为它的性能很差,除非组数很少或处理的列数非常多(在这种情况下 SubDataFrame 避免过度编译)

# 详细信息

  • renamecols::Bool=true :是否以cols => 函数形式自动生成列名应包含或不包含转换函数的名称。
  • keepkeys::Bool=true : gd 的分组列是否应保留在返回的表格数据中。
  • ungroup::Bool=true :gd 上操作的返回值是否应该是表格 或 GroupedDataFrame。

# 另请参阅

select | select! | combine | transform