2026a

# select!


不复制新的表格对列转换,行数不变

函数库: TyBase

# 语法

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

# 说明

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

select!(df::AbstractDataFrame, args...; renamecols::Bool=true) 在原表格df上进行操作,其中包含来自 args 指定的 df 的列并返回它。 行数与原DataFrame相同,列为转换后的结果。 示例


select!(args::Base.Callable, df::DataFrame; renamecols::Bool=true)对表格df应用方法args,行数不变。示例


select!(gd::GroupedDataFrame, args...; ungroup::Bool=true, renamecols::Bool=true) 在原表df上进行转换,其中包含来自 args 指定的 分组表格 gd 的列并返回它。行数与原DataFrame相同,列为转换后的结果示例


select!(f::Base.Callable, gd::GroupedDataFrame; ungroup::Bool=true, renamecols::Bool=true)对分组表格gd应用方法f,行数不变。

# 示例

选择指定列

创建一个表格

using TyBase
df = DataFrame([1:10;]',:auto)
df = 1×10 DataFrame
 Row │ x1     x2     x3     x4     x5     x6     x7     x8     x9     x10
     │ Int64  Int64  Int64  Int64  Int64  Int64  Int64  Int64  Int64  Int64
─────┼──────────────────────────────────────────────────────────────────────
   1 │     1      2      3      4      5      6      7      8      9     10

选择奇数列

select!(df,[1,3,5,7,9])
df
df = 1×5 DataFrame
 Row │ x1     x3     x5     x7     x9
     │ Int64  Int64  Int64  Int64  Int64
─────┼───────────────────────────────────
   1 │     1      3      5      7      9
对列使用函数
using TyBase
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

select!(df, :a => ByRow(sin) => :c, :b)
df
df =  3×2 DataFrame
 Row │ c         b
     │ Float64   Int64
─────┼─────────────────
   1 │ 0.841471      4
   2 │ 0.909297      5
   3 │ 0.14112       6
对行使用函数
using TyBase
import 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(:)表示选择所有列

select!(df1, AsTable(:) => ByRow(DataFrames.mean), renamecols=false)
df1
df1 = 3×1 DataFrame
 Row │ a_b
     │ Float64
─────┼─────────
   1 │     2.5
   2 │     3.5
   3 │     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

计算行的统计量

select!(df2, AsTable(:) => ByRow(x -> (mean=DataFrames.mean(x), std=DataFrames.std(x))) => :stats,
        AsTable(:) => ByRow(x -> (mean=DataFrames.mean(x), std=DataFrames.std(x))) => AsTable)
df2
df2 = 3×3 DataFrame
 Row │ stats                    mean     std
     │ NamedTup…                Float64  Float64
─────┼───────────────────────────────────────────
   1 │ (mean = 4.0, std = 3.0)      4.0      3.0
   2 │ (mean = 5.0, std = 3.0)      5.0      3.0
   3 │ (mean = 6.0, std = 3.0)      6.0      3.0
对表应用函数
using TyBase
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
select!(first,df)
df
df = 3×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      4
   2 │     1      4
   3 │     1      4

虽然first函数仅求表格第一行,但select!返回与原表相同行数,因此复制结果为三行

对分组表格使用函数

创建一个表格并由 a 分组

using TyBase
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列改名并求和,使用keepkeys参数不显示:a列

select!(gd, :b => :b1, :c => :c1, [:b, :c] => +)
gd = 8×4 DataFrame
 Row │ a      b1     c1     b_c_+
     │ Int64  Int64  Int64  Int64
─────┼────────────────────────────
   1 │     1      2      1      3
   2 │     2      1      2      3
   3 │     3      2      3      5
   4 │     4      1      4      5
   5 │     1      2      5      7
   6 │     2      1      6      7
   7 │     3      2      7      9
   8 │     4      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 => 函数形式自动生成列名应包含或不包含转换函数的名称。
  • ungroup::Bool=true :gd 上操作的返回值是否应该是表格 或 GroupedDataFrame。

# 另请参阅

combine | select | transform | transform!