# 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-输入
对表格进行操作的函数,可以为以下方式
标准列选择器:整数、符号、字符串、整数向量、符号向量、字符串向量、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 => 函数形式自动生成列名应包含或不包含转换函数的名称。
- keepkeys::Bool=true : gd 的分组列是否应保留在返回的表格数据中。
- ungroup::Bool=true :gd 上操作的返回值是否应该是表格 或 GroupedDataFrame。