我想轻松地将多个函数应用于 Julia 数据框中的单个列。这是 Julia Academy 上 DataFrames.jl 课程笔记本 5 中的一个简单示例。
Bogumil 向我们展示了jumps通过执行以下操作轻松计算列的平均值:
combine(df, :jumps => mean)
Run Code Online (Sandbox Code Playgroud)
| jumps_mean | |
|---|---|
| Float64 | |
| 1 | 2.7186 |
但是如果我想应用多个函数jumps来获得多个汇总统计呢?到目前为止,我可以使以下内容起作用:
combine(df, :jumps => (x -> [(mean(x), std(x), minimum(x), maximum(x))]) => [:mean, :std, :min, :max])
Run Code Online (Sandbox Code Playgroud)
| 意思 | 标准 | 最大限度 | 分钟 | |
|---|---|---|---|---|
| Float64 | Float64 | 64位 | 64位 | |
| 1 | 2.7186 | 0.875671 | 2 | 11 |
是否有更简洁的语法来执行此操作,而无需将函数返回包装起来[ ]或专门使用匿名函数?
例如,我想做:
combine(df, :jumps => (mean, std, minimum, maximum))
Run Code Online (Sandbox Code Playgroud) 我定义了以下线性插值器:
\njulia> using DataFrames, Interpolations\n\njulia> xs = 1:0.2:5;\n\njulia> ys = log.(xs);\n\njulia> li = LinearInterpolation(xs, ys);\nRun Code Online (Sandbox Code Playgroud)\n并有一个数据框:
\njulia> df = DataFrame(x=2:0.1:3)\n11\xc3\x971 DataFrame\n Row \xe2\x94\x82 x\n \xe2\x94\x82 Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n 1 \xe2\x94\x82 2.0\n 2 \xe2\x94\x82 2.1\n 3 \xe2\x94\x82 2.2\n 4 \xe2\x94\x82 2.3\n 5 \xe2\x94\x82 2.4\n 6 \xe2\x94\x82 2.5\n 7 \xe2\x94\x82 2.6\n 8 \xe2\x94\x82 2.7\n 9 \xe2\x94\x82 2.8\n 10 \xe2\x94\x82 2.9\n 11 \xe2\x94\x82 3.0\nRun Code Online (Sandbox Code Playgroud)\n我可以将:x数据框的列传递给li递给这样的:
julia> li(df.x)\n11-element Vector{Float64}:\n 0.6931471805599453\n 0.7408022704621078\n 0.7884573603642704\n 0.831963048859085\n 0.8754687373538997\n 0.915490091190668\n 0.9555114450274363\n 0.9925654311042973\n …Run Code Online (Sandbox Code Playgroud) 我是朱莉娅的新手。得到这个 InexactError 。提到我曾尝试预先转换为浮点数但没有奏效,也许我做错了什么。
column = df[:, i]
max = maximum(column)
min = minimum(column)
scaled_column = (column .- min)/max # This is the error, I think
df[:, i] = scaled_column
Run Code Online (Sandbox Code Playgroud)
julia> VERSION
v"1.4.2"
Run Code Online (Sandbox Code Playgroud) 我正在尝试根据来自其他(数字)列的值范围创建一个分类变量。但是,当我missings在数字列中时,代码不起作用
这是一个可复制的示例:
using RDatasets;
using DataFrames;
using Pipe;
using FreqTables;
df = dataset("datasets","iris")
#lowercase columns just for convenience
@pipe df |> rename!(_, [lowercase(k) for k in names(df)]);
#without this line, the code works fine
@pipe df |> allowmissing!(_, :sepallength) |> replace!(_.sepallength, 4.9 => missing);
df[:size] = @. ifelse(df[:sepallength]<=4.7, "small", missing)
df[:size] = @. ifelse((df[:sepallength]>4.7) & (df[:sepallength]<=4.9), "avg", df[:size])
df[:size] = @. ifelse((df[:sepallength]>4.9) & (df[:sepallength]<=5), "large", df[:size])
df[:size] = @. ifelse(df[:sepallength]>5, "huge", df[:size])
println(@pipe df |> freqtable(_, :size))
Run Code Online (Sandbox Code Playgroud)
输出: …
在 JuMP 优化问题中指定只能为 0 或 1 的变量的语法是什么?
我正在使用以下代码:
@variable(mod, X == 1 || 0)
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我想过滤数据帧并将值附加到数据帧中的新/现有列。例如,在下面的数据框中,我想将 0.7 的值附加到列 pre-mean 中,其中月份值等于 11。所以换句话说,pre_mean 列的第 2 到 5 行应该包含 0.7 的值,而所有其他列都应该有一个 NaN 值。
我试过这样的事情,但当然这是不正确的。
df[:pre_mean] = ifelse.(df[:month] .== 11, 0.7, df)
Run Code Online (Sandbox Code Playgroud)
在 python 中,你可以使用 pd.apply 或 np.where 函数来做到这一点,
#How to do in python
df["pre_mean"] = np.where(df["month"] == 11, 0.7, None)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在 Julia 中实现这一目标?有任何想法吗?
我在 julia 中有以下函数,用于读取 Arrow 文件(使用 Arrow.jl)以从磁盘读取数据并处理它:
function getmembershipsdays(fromId, toId)
memberships = Arrow.Table("HouseholdMemberships.arrow") |> DataFrame
filter!([:IndividualId] => id -> id >= fromId && id <= toId, memberships)
...
end
> Error: ERROR: LoadError: MethodError: no method matching
> deleteat!(::Arrow.Primitive{Int64,Array{Int64,1}}, ::Array{Int64,1})
The DataFrame has the following structure:
123226x10 DataFrame
Row | MembershipId | IndividualId | HouseholdId | ...
| Int64 | Int64 | Int64 |
Run Code Online (Sandbox Code Playgroud)
函数中用于单步执行 Dataframe 的其余代码有效,但如果添加过滤条件,则会出现此错误。就好像 Dataframe 列没有转换为底层的 julia 类型。
如果我做
m = filter([:IndividualId] => id -> id >= fromId …Run Code Online (Sandbox Code Playgroud) 我经常想在数据表中找到一些分组变量的独特组合。使用 R + dplyr,我的正常工作流程是 combine groupby(data, var1, var2, var3) %>% summarise,它返回一个新表,其中包含var1、var2、var3、 中的每个唯一值组合对应一行data。
在 DataFrames.jl 中执行此操作的惯用方法是什么?
我想根据来自不同列的多个值过滤 DataFrame。我写了下面的代码,但它给了我一个错误,ERROR: TypeError: non-boolean (BitArray{1}) used in boolean context.
df[((df.eruption .== "CC2011") && (df.dataset .== "MODIS.NDVI.CDI")), :]
Run Code Online (Sandbox Code Playgroud)
在哪里eruption和dataset在数据帧列
任何想法我做错了什么?
给定 DataFrames.jl 中的以下数据框:
\njulia> using DataFrames\n\njulia> df = DataFrame(x1=[1, 2, 3], x2=Union{Int,Missing}[1, 2, 3], x3=[1, 2, missing])\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 x1 x2 x3\n \xe2\x94\x82 Int64 Int64? Int64?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n 1 \xe2\x94\x82 1 1 1\n 2 \xe2\x94\x82 2 2 2\n 3 \xe2\x94\x82 3 3 missing\nRun Code Online (Sandbox Code Playgroud)\n我想找到missing其中包含价值的列。
我努力了:
\njulia> names(df, Missing)\nString[]\nRun Code Online (Sandbox Code Playgroud)\n但这是不正确的,因为names函数在传递类型时会查找传递类型的子类型。