gpt4 book ai didi

julia - 在使用正则表达式引用列的同时在 GroupedDataFrame 上使用 combine Julia 函数

转载 作者:行者123 更新时间:2023-12-04 15:23:46 26 4
gpt4 key购买 nike

正如您从这个问题中可以看出的那样,我是 Julia 的一个非常新的用户,我只是想做一些我已经在 python 中做过的事情,但在黑暗中有点磕磕绊绊。我现在想做的是根据特定的数据分组在多个列上创建一些简单的统计信息。所以在做了类似的事情之后:

df = DataFrame(CSV.File(file));
gdf = groupby(df, :Class);

df 看起来像:

df[1:3, [:Class, :V1, :V2, :V10]]

Class V1 V2 V10
Int64 Float64 Float64 Float64
1 0 -1.35981 -0.0727812 0.0907942
2 1 1.19186 0.266151 -0.166974
3 0 -1.35835 -1.34016 0.207643

...

我知道我可以做类似的事情:

combine(gdf, :V1 => maximum => :v1_max, :V1 => minimum => :v1_min, nrow)

但后来我看到我可以使用正则表达式来引用多个列,所以我的想法是做一些简单的事情,比如:

combine(gdf, r"V[0-9]{1,2}" => maximum)

并让 Julia 在一行中为与分组 DataFrame 的正则表达式匹配的所有列生成最大值。

我终于能够做到这一点,我猜这不是一种非常有效的方式,因此寻求任何人的帮助来帮助我改进 Julia 的使用。

foo = DataFrame(Class=[0, 1])
for v in ["V$i" for i in 1:28]
foo = join(foo,
combine(gdf, v => maximum => string(v, "_max")),
combine(gdf, v => minimum => string(v, "_min")),
on=:Class)
end

最佳答案

随便写:

combine(gdf, names(gdf, r"V[0-9]{1,2}") .=> maximum)

(注意=>前面的.)

在这种情况下,将自动生成目标列名称。

我上面写的是以下内容的简写:

combine(gdf, [n => maximum for n in names(gdf, r"V[0-9]{1,2}")])

另一种写法是:

combine(AsTable(r"V[0-9]{1,2}") => x -> map(maximum, x), gdf)

当保留旧的列名时。

combine 语法非常灵活。我建议您查看其文档字符串以了解所有可用选项。


考虑以下示例:

julia> using DataFrames

julia> passthrough(x...) = (@show x; x)
passthrough (generic function with 1 method)

julia> df = DataFrame(Class=[1,1,2], V1=1:3, V2=11:13)
3×3 DataFrame
│ Row │ Class │ V1 │ V2 │
│ │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1 │ 1 │ 1 │ 11 │
│ 2 │ 1 │ 2 │ 12 │
│ 3 │ 2 │ 3 │ 13 │

julia> gdf = groupby(df, :Class)
GroupedDataFrame with 2 groups based on key: Class
First Group (2 rows): Class = 1
│ Row │ Class │ V1 │ V2 │
│ │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1 │ 1 │ 1 │ 11 │
│ 2 │ 1 │ 2 │ 12 │

Last Group (1 row): Class = 2
│ Row │ Class │ V1 │ V2 │
│ │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1 │ 2 │ 3 │ 13 │

julia> combine(gdf, r"V[0-9]{1,2}" .=> passthrough)
x = ([1, 2], [11, 12])
x = ([3], [13])
2×2 DataFrame
│ Row │ Class │ V1_V2_passthrough │
│ │ Int64 │ Tuple… │
├─────┼───────┼────────────────────┤
│ 1 │ 1 │ ([1, 2], [11, 12]) │
│ 2 │ 2 │ ([3], [13]) │

julia> combine(gdf, r"V[0-9]{1,2}" => passthrough)
x = ([1, 2], [11, 12])
x = ([3], [13])
2×2 DataFrame
│ Row │ Class │ V1_V2_passthrough │
│ │ Int64 │ Tuple… │
├─────┼───────┼────────────────────┤
│ 1 │ 1 │ ([1, 2], [11, 12]) │
│ 2 │ 2 │ ([3], [13]) │

julia> combine(gdf, names(gdf, r"V[0-9]{1,2}") .=> passthrough)
x = ([1, 2],)
x = ([3],)
x = ([11, 12],)
x = ([13],)
2×3 DataFrame
│ Row │ Class │ V1_passthrough │ V2_passthrough │
│ │ Int64 │ Tuple… │ Tuple… │
├─────┼───────┼────────────────┼────────────────┤
│ 1 │ 1 │ ([1, 2],) │ ([11, 12],) │
│ 2 │ 2 │ ([3],) │ ([13],) │

julia> combine(gdf, names(gdf, r"V[0-9]{1,2}") => passthrough)
x = ([1, 2], [11, 12])
x = ([3], [13])
2×2 DataFrame
│ Row │ Class │ V1_V2_passthrough │
│ │ Int64 │ Tuple… │
├─────┼───────┼────────────────────┤
│ 1 │ 1 │ ([1, 2], [11, 12]) │
│ 2 │ 2 │ ([3], [13]) │

尤其重要的是要了解传递给 combine 的内容:

julia> r"V[0-9]{1,2}" .=> passthrough
r"V[0-9]{1,2}" => passthrough

julia> r"V[0-9]{1,2}" => passthrough
r"V[0-9]{1,2}" => passthrough

julia> names(gdf, r"V[0-9]{1,2}") .=> passthrough
2-element Array{Pair{String,typeof(passthrough)},1}:
"V1" => passthrough
"V2" => passthrough

julia> names(gdf, r"V[0-9]{1,2}") => passthrough
["V1", "V2"] => passthrough

如您所见,一切都取决于传递给 combine 的内容。特别是 r"V[0-9]{1,2}".=> passthroughr"V[0-9]{1,2}"=> passthrough code> 被解析为完全相同的表达式,在这种情况下,passthrough 每组仅调用一次,获取多个位置参数。

另一方面,names(gdf, r"V[0-9]{1,2}") .=> passthrough 使 passthrough 被调用每组单独列。

关于julia - 在使用正则表达式引用列的同时在 GroupedDataFrame 上使用 combine Julia 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62745171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com