# 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-输入
对表格进行操作的函数,可以为以下方式
标准列选择器:整数、符号、字符串、整数向量、符号向量、字符串向量、All、Cols、:、Between、Not 和 正则表达式
cols => function:指示应该使用包含列 cols 的位置参数调用函数,该列可以是任何有效的列选择器; 在这种情况下,目标列名称是自动生成的,并且假定函数返回单个值或向量; 默认情况下,通过连接源列名和函数名来创建生成的名称。
cols => function => target_cols:另外明确指定目标列或列,它必须是单个名称(作为符号或字符串)、名称向量或 AsTable。 此外,它可以是一个函数,它将字符串或字符串向量作为包含由 cols 选择的列名称的参数,并返回目标列名称(允许除 AsTable 之外的所有接受类型)。
col => target_cols :它将列 col 重命名为 target_cols,它必须是单个名称(作为符号或字符串)、名称向量或 AsTable。
nrow 或 nrow => target_cols 形式:可有效计算组中的行数; 没有 target_cols 新列称为 :nrow,否则它必须是单一名称(作为符号或字符串)。
包含由点 2 到 5 中描述的 Pair 语法指定的变换的向量或矩阵
如果处理 GroupedDataFrame,则将使用与每个组对应的 SubDataFrame 调用函数,如果处理 AbstractDataFrame,则使用数据帧本身调用该函数; 应该避免这种形式,因为它的性能很差,除非组数很少或处理的列数非常多(在这种情况下 SubDataFrame 避免过度编译)
# 详细信息
- renamecols::Bool=true :是否以cols => 函数形式自动生成列名应包含或不包含转换函数的名称。
- ungroup::Bool=true :gd 上操作的返回值是否应该是表格 或 GroupedDataFrame。
# 另请参阅
combine | select | transform | transform!