Julia 编程 - DataFrames
DataFrame 可以定义为表格或电子表格,我们可以用它来排序和探索一组相关的数据值。 换句话说,我们可以将其称为用于保存表格数据的更智能的数组。 在使用之前,我们需要下载并安装DataFrame和CSV包,如下 −
(@v1.5) pkg> add DataFrames (@v1.5) pkg> add CSV
要开始使用DataFrames包,请输入以下命令 −
julia> using DataFrames
将数据加载到 DataFrame 中
创建新 DataFrame 的方法有多种(我们将在本节后面讨论),但将数据加载到 DataFrame 的最快方法之一是加载 Anscombe 数据集。 为了更好地理解,让我们看下面的例子 −
anscombe = DataFrame( [10 10 10 8 8.04 9.14 7.46 6.58; 8 8 8 8 6.95 8.14 6.77 5.76; 13 13 13 8 7.58 8.74 12.74 7.71; 9 9 9 8 8.81 8.77 7.11 8.84; 11 11 11 8 8.33 9.26 7.81 8.47; 14 14 14 8 9.96 8.1 8.84 7.04; 6 6 6 8 7.24 6.13 6.08 5.25; 4 4 4 19 4.26 3.1 5.39 12.5; 12 12 12 8 10.84 9.13 8.15 5.56; 7 7 7 8 4.82 7.26 6.42 7.91; 5 5 5 8 5.68 4.74 5.73 6.89]);
julia> rename!(anscombe, [Symbol.(:N, 1:4); Symbol.(:M, 1:4)]) 11×8 DataFrame │ Row │ N1 │ N2 │ N3 │ N4 │ M1 │ M2 │ M3 │ M4 │ │ │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ 10.0 │ 10.0 │ 10.0 │ 8.0 │ 8.04 │ 9.14 │ 7.46 │ 6.58 │ │ 2 │ 8.0 │ 8.0 │ 8.0 │ 8.0 │ 6.95 │ 8.14 │ 6.77 │ 5.76 │ │ 3 │ 13.0 │ 13.0 │ 13.0 │ 8.0 │ 7.58 │ 8.74 │ 12.74 │ 7.71 │ │ 4 │ 9.0 │ 9.0 │ 9.0 │ 8.0 │ 8.81 │ 8.77 │ 7.11 │ 8.84 │ │ 5 │ 11.0 │ 11.0 │ 11.0 │ 8.0 │ 8.33 │ 9.26 │ 7.81 │ 8.47 │ │ 6 │ 14.0 │ 14.0 │ 14.0 │ 8.0 │ 9.96 │ 8.1 │ 8.84 │ 7.04 │ │ 7 │ 6.0 │ 6.0 │ 6.0 │ 8.0 │ 7.24 │ 6.13 │ 6.08 │ 5.25 │ │ 8 │ 4.0 │ 4.0 │ 4.0 │ 19.0 │ 4.26 │ 3.1 │ 5.39 │ 12.5 │ │ 9 │ 12.0 │ 12.0 │ 12.0 │ 8.0 │ 10.84 │ 9.13 │ 8.15 │ 5.56 │ │10 │ 7.0 │ 7.0 │ 7.0 │ 8.0 │ 4.82 │ 7.26 │ 6.42 │ 7.91 │ │11 │ 5.0 │ 5.0 │ 5.0 │ 8.0 │ 5.68 │ 4.74 │ 5.73 │ 6.89 │
我们将 DataFrame 分配给名为 Anscombe 的变量,将它们转换为数组,然后重命名列。
收集的数据集
我们还可以使用另一个名为RDatasets包的数据集包。 它包含其他几个著名的数据集,包括 Anscombe 的数据集。 在我们开始使用它之前,我们需要首先下载并安装它,如下所示 −
(@v1.5) pkg> add RDatasets
要开始使用此软件包,请键入以下命令 −
julia> using DataFrames julia> anscombe = dataset("datasets","anscombe") 11×8 DataFrame │ Row │ X1 │ X2 │ X3 │ X4 │ Y1 │ Y2 │ Y3 │ Y4 │ │ │ Int64 │ Int64 │ Int64 │ Int64 │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼───────┼───────┼───────┼───────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ 10 │ 10 │ 10 │ 8 │ 8.04 │ 9.14 │ 7.46 │ 6.58 │ │ 2 │ 8 │ 8 │ 8 │ 8 │ 6.95 │ 8.14 │ 6.77 │ 5.76 │ │ 3 │ 13 │ 13 │ 13 │ 8 │ 7.58 │ 8.74 │ 12.74│ 7.71 │ │ 4 │ 9 │ 9 │ 9 │ 8 │ 8.81 │ 8.77 │ 7.11 │ 8.84 │ │ 5 │ 11 │ 11 │ 11 │ 8 │ 8.33 │ 9.26 │ 7.81 │ 8.47 │ │ 6 │ 14 │ 14 │ 14 │ 8 │ 9.96 │ 8.1 │ 8.84 │ 7.04 │ │ 7 │ 6 │ 6 │ 6 │ 8 │ 7.24 │ 6.13 │ 6.08 │ 5.25 │ │ 8 │ 4 │ 4 │ 4 │ 19 │ 4.26 │ 3.1 │ 5.39 │ 12.5 │ │ 9 │ 12 │ 12 │ 12 │ 8 │ 10.84 │ 9.13 │ 8.15 │ 5.56 │ │ 10 │ 7 │ 7 │ 7 │ 8 │ 4.82 │ 7.26 │ 6.42 │ 7.91 │ │ 11 │ 5 │ 5 │ 5 │ 8 │ 5.68 │ 4.74 │ 5.73 │ 6.89 │
空 DataFrame
我们还可以通过简单地提供有关数组中给出的行、列的信息来创建 DataFrame。
示例
julia> empty_df = DataFrame(X = 1:10, Y = 21:30) 10×2 DataFrame │ Row │ X │ Y │ │ │ Int64 │ Int64 │ ├─────┼───────┼───────┤ │ 1 │ 1 │ 21 │ │ 2 │ 2 │ 22 │ │ 3 │ 3 │ 23 │ │ 4 │ 4 │ 24 │ │ 5 │ 5 │ 25 │ │ 6 │ 6 │ 26 │ │ 7 │ 7 │ 27 │ │ 8 │ 8 │ 28 │ │ 9 │ 9 │ 29 │ │ 10 │ 10 │ 30 │
要创建完全空的 DataFrame,我们只需提供列名称并定义其类型,如下所示 −
julia> Complete_empty_df = DataFrame(Name=String[], W=Float64[], H=Float64[], M=Float64[], V=Float64[]) 0×5 DataFrame
julia> Complete_empty_df = vcat(Complete_empty_df, DataFrame(Name="EmptyTestDataFrame", W=5.0, H=5.0, M=3.0, V=5.0)) 1×5 DataFrame │ Row │ Name │ W │ H │ M │ V │ │ │ String │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼────────────────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ EmptyTestDataFrame │ 5.0 │ 5.0 │ 3.0 │ 5.0 │
julia> Complete_empty_df = vcat(Complete_empty_df, DataFrame(Name="EmptyTestDataFrame2", W=6.0, H=6.0, M=5.0, V=7.0)) 2×5 DataFrame │ Row │ Name │ W │ H │ M │ V │ │ │ String │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼─────────────────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ EmptyTestDataFrame │ 5.0 │ 5.0 │ 3.0 │ 5.0 │ │ 2 │ EmptyTestDataFrame2 │ 6.0 │ 6.0 │ 5.0 │ 7.0 │
绘制 Anscombe
现在Anscombe数据集已经加载,我们也可以用它做一些统计。 名为describe()的内置函数使我们能够计算数据集列的统计属性。 您可以为属性提供下面给出的符号 −
mean
std
min
q25
median
q75
max
eltype
nunique
first
last
nmissing
示例
julia> describe(anscombe, :mean, :std, :min, :median, :q25) 8×6 DataFrame │ Row │ variable │ mean │ std │ min │ median │ q25 │ │ │ Symbol │ Float64 │ Float64 │ Real │ Float64 │ Float64 │ ├─────┼──────────┼─────────┼─────────┼──────┼─────────┼─────────┤ │ 1 │ X1 │ 9.0 │ 3.31662 │ 4 │ 9.0 │ 6.5 │ │ 2 │ X2 │ 9.0 │ 3.31662 │ 4 │ 9.0 │ 6.5 │ │ 3 │ X3 │ 9.0 │ 3.31662 │ 4 │ 9.0 │ 6.5 │ │ 4 │ X4 │ 9.0 │ 3.31662 │ 8 │ 8.0 │ 8.0 │ │ 5 │ Y1 │ 7.50091 │ 2.03157 │ 4.26 │ 7.58 │ 6.315 │ │ 6 │ Y2 │ 7.50091 │ 2.03166 │ 3.1 │ 8.14 │ 6.695 │ │ 7 │ Y3 │ 7.5 │ 2.03042 │ 5.39 │ 7.11 │ 6.25 │ │ 8 │ Y4 │ 7.50091 │ 2.03058 │ 5.25 │ 7.04 │ 6.17 │
我们还可以在 XY 数据集之间进行比较,如下所示 −
julia> [describe(anscombe[:, xy], :mean, :std, :median, :q25) for xy in [[:X1, :Y1], [:X2, :Y2], [:X3, :Y3], [:X4, :Y4]]] 4-element Array{DataFrame,1}: 2×5 DataFrame │ Row │ variable │ mean │ std │ median │ q25 │ │ │ Symbol │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼──────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ X1 │ 9.0 │ 3.31662 │ 9.0 │ 6.5 │ │ 2 │ Y1 │ 7.50091 │ 2.03157 │ 7.58 │ 6.315 │ 2×5 DataFrame │ Row │ variable │ mean │ std │ median │ q25 │ │ │ Symbol │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼──────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ X2 │ 9.0 │ 3.31662 │ 9.0 │ 6.5 │ │ 2 │ Y2 │ 7.50091 │ 2.03166 │ 8.14 │ 6.695 │ 2×5 DataFrame │ Row │ variable │ mean │ std │ median │ q25 │ │ │ Symbol │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼──────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ X3 │ 9.0 │ 3.31662 │ 9.0 │ 6.5 │ │ 2 │ Y3 │ 7.5 │ 2.03042 │ 7.11 │ 6.25 │ 2×5 DataFrame │ Row │ variable │ mean │ std │ median │ q25 │ │ │ Symbol │ Float64 │ Float64 │ Float64 │ Float64 │ ├─────┼──────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ X4 │ 9.0 │ 3.31662 │ 8.0 │ 8.0 │ │ 2 │ Y4 │ 7.50091 │ 2.03058 │ 7.04 │ 6.17 │
让我们揭示 Anscombe 的真正目的,即将其四重奏的四组绘制如下 −
julia> using StatsPlots [ Info: Precompiling StatsPlots [f3b207a7-027a-5e70-b257-86293d7955fd] julia> @df anscombe scatter([:X1 :X2 :X3 :X4], [:Y1 :Y2 :Y3 :Y4], smooth=true, line = :red, linewidth = 2, title= ["X$i vs Y$i" for i in (1:4)'], legend = false, layout = 4, xlimits = (2, 20), ylimits = (2, 14))
回归和模型
在本节中,我们将使用数据集的线性回归线。 为此,我们需要使用广义线性模型(GLM)包,您需要首先添加如下 −
(@v1.5) pkg> add GLM
现在让我们通过使用 @formula 宏指定公式并提供列名称以及 DataFrame 名称来创建线性回归模型。 下面给出了相同的示例 −
julia> linearregressionmodel = fit(LinearModel, @formula(Y1 ~ X1), anscombe) StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}} Y1 ~ 1 + X1 Coefficients: ─────────────────────────────────────────────────────────────────────── Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% ─────────────────────────────────────────────────────────────────────── (Intercept) 3.00009 1.12475 2.67 0.0257 0.455737 5.54444 X1 0.500091 0.117906 4.24 0.0022 0.23337 0.766812 ───────────────────────────────────────────────────────────────────────
让我们检查一下上面创建的线性回归模型的摘要和系数 −
julia> summary(linearregressionmodel) "StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}" julia> coef(linearregressionmodel) 2-element Array{Float64,1}: 3.0000909090909054 0.5000909090909096
现在让我们为回归线生成一个函数。 函数的形式为y=ax+c。
julia> f(x) = coef(linearmodel)[2] * x + coef(linearmodel)[1] f (generic function with 1 method)
一旦我们有了描述回归线的函数,我们就可以画出如下图 −
julia> p1 = plot(anscombe[:X1], anscombe[:Y1], smooth=true, seriestype=:scatter, title = "X1 vs Y1", linewidth=8, linealpha=0.5, label="data") julia> plot!(f, 2, 20, label="correlation")
使用 DataFrame
众所周知,没有什么是完美的。 对于数据集也是如此,因为并非所有数据集都是一致和整洁的。 为了展示如何使用 DataFrame 的不同项目,让我们创建一个测试 DataFrame −
julia> testdf = DataFrame( Number = [3, 5, 7, 8, 20 ], Name = ["Lithium", "Boron", "Nitrogen", "Oxygen", "Calcium" ], AtomicWeight = [6.941, 10.811, 14.0067, 15.9994, 40.078 ], Symbol = ["Li", "B", "N", "O", "Ca" ], Discovered = [1817, 1808, 1772, 1774, missing ]) 5×5 DataFrame │ Row │ Number │ Name │ AtomicWeight │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼──────────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │
处理缺失值
数据集中可能存在一些缺失值。 可以借助 describe() 函数进行检查,如下所示 −
julia> describe(testdf) 5×8 DataFrame │ Row │ variable │ mean │ min │ median │ max │ nunique │ nmissing │ eltype │ │ │ Symbol │ Union… │ Any │ Union… │ Any │ Union… │ Union… │ Type │ ├─────┼──────────────┼─────────┼───────┼─────────┼────────┼─────────┼──────────┼───────────────────────┤ │ 1 │ Number │ 8.6 │ 3 │ 7.0 │ 20 │ │ │ Int64 │ │ 2 │ Name │ │ Boron │ │ Oxygen │ 5 │ │ String │ │ 3 │ AtomicWeight │ 17.5672 │ 6.941 │ 14.0067 │ 40.078 │ │ │ Float64 │ │ 4 │ Symbol │ │ B │ │ O │ 5 │ │ String │ │ 5 │ Discovered │ 1792.75 │ 1772 │ 1791.0 │ 1817 │ │ 1 │ Union{Missing, Int64} │
Julia 提供了一种名为 Missing 的特殊数据类型来解决此类问题。 此数据类型表明此位置没有可用值。 这就是为什么 DataFrames 包允许我们获取大部分数据集并确保计算不会因缺失值而被篡改。
寻找缺失值
我们可以使用 ismissing() 函数检查 DataFrame 是否有缺失值。
示例
julia> for row in 1:nrows for col in 1:ncols if ismissing(testdf [row,col]) println("$(names(testdf)[col]) value for $(testdf[row,:Name]) is missing!") end end end
修复数据框
我们可以使用以下代码来更改不可接受的值,例如"n/a"、"0"、"missing"。 下面的代码将在每个单元格中查找上述不可接受的值。
示例
julia> for row in 1:size(testdf, 1) # or nrow(testdf) for col in 1:size(testdf, 2) # or ncol(testdf) println("processing row $row column $col ") temp = testdf [row,col] if ismissing(temp) println("skipping missing") elseif temp == "n/a" || temp == "0" || temp == 0 testdf [row, col] = missing println("changed row $row column $col ") end end end processing row 1 column 1 processing row 1 column 2 processing row 1 column 3 processing row 1 column 4 processing row 1 column 5 processing row 2 column 1 processing row 2 column 2 processing row 2 column 3 processing row 2 column 4 processing row 2 column 5 processing row 3 column 1 processing row 3 column 2 processing row 3 column 3 processing row 3 column 4 processing row 3 column 5 processing row 4 column 1 processing row 4 column 2 processing row 4 column 3 processing row 4 column 4 processing row 4 column 5 processing row 5 column 1 processing row 5 column 2 processing row 5 column 3 processing row 5 column 4 processing row 5 column 5 skipping missing
处理缺失值
Julia 提供了在统计意义上表示缺失值的支持,即观察中的变量没有可用值但理论上存在有效值的情况。
completecases()
completecases() 函数用于查找包含缺失值的列的最大值。
示例
julia> maximum(testdf[completecases(testdf), :].Discovered) 1817
dropmissing()
dropmissing() 函数用于获取没有缺失值的 DataFrame 副本。
示例
julia> dropmissing(testdf) 4×5 DataFrame │ Row │ Number │ Name │ AtomicWeight │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64 │ ├─────┼────────┼──────────┼──────────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │
修改 DataFrame
Julia 的 DataFrames 包提供了各种方法,您可以使用它们添加、删除、重命名列以及添加/删除行。
添加列
我们可以使用hcat()函数将一列整数添加到DataFrame中。 可以如下使用 −
julia> hcat(testdf, axes(testdf, 1)) 5×6 DataFrame │ Row │ Number │ Name │ AtomicWeight │ Symbol │ Discovered │ x1 │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ Int64 │ ├─────┼────────┼──────────┼──────────────┼────────┼────────────┼───────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ 1 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ 2 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ 3 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ 4 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │ 5 │
但是正如您所注意到的,我们没有更改 DataFrame 或将任何新的 DataFrame 分配给符号。 我们可以添加另一列,如下所示 −
julia> testdf [!, :MP] = [180.7, 2300, -209.86, -222.65, 839] 5-element Array{Float64,1}: 180.7 2300.0 -209.86 -222.65 839.0 julia> testdf 5×6 DataFrame │ Row │ Number │ Name │ AtomicWeight │ Symbol │ Discovered │ MP │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ Float64 │ ├─────┼────────┼──────────┼──────────────┼────────┼────────────┼─────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ 180.7 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ 2300.0 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ -209.86 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ -222.65 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │ 839.0 │
我们在测试 DataFrame 中添加了一列包含所有元素熔点的列。
删除列
我们可以使用select!()函数从DataFrame中删除一列。 它将创建一个包含所选列的新 DataFrame,因此要删除特定列,我们需要使用 select!() 和 Not。 它显示在给定的示例中 −
julia> select!(testdf, Not(:MP)) 5×5 DataFrame │ Row │ Number │ Name │ AtomicWeight │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼──────────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │
我们已从数据框中删除了 MP 列。
重命名列
我们可以使用rename!()函数来重命名DataFrame中的列。 我们将 AtomicWeight 列重命名为 AW,如下所示 −
julia> rename!(testdf, :AtomicWeight => :AW) 5×5 DataFrame │ Row │ Number │ Name │ AW │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼─────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │
添加行
我们可以使用 push!() 函数和合适的数据在 DataFrame 中添加行。 在下面给出的示例中,我们将添加具有元素 Cooper 的行 −
示例
julia> push!(testdf, [29, "Copper", 63.546, "Cu", missing]) 6×5 DataFrame │ Row │ Number │ Name │ AW │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼─────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │ │ 4 │ 8 │ Oxygen │ 15.9994 │ O │ 1774 │ │ 5 │ 20 │ Calcium │ 40.078 │ Ca │ missing │ │ 6 │ 29 │ Copper │ 63.546 │ Cu │ missing │
删除行
我们可以使用 deleterows!() 函数和合适的数据来从 DataFrame 中删除行。 在下面给出的示例中,我们将从测试数据框中删除三行(第 4、第 5 和第 6) −
示例
julia> deleterows!(testdf, 4:6) 3×5 DataFrame │ Row │ Number │ Name │ AW │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼─────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │
在 DataFrame 中查找值
要查找 DataFrame 中的值,我们需要使用元素运算符检查所有行。 该运算符将返回一个布尔值数组来指示单元格是否满足条件。
示例
julia> testdf[:, :AW] .< 10 3-element BitArray{1}: 1 0 0 julia> testdf[testdf[:, :AW] .< 10, :] 1×5 DataFrame │ Row │ Number │ Name │ AW │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼─────────┼─────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │
排序
要对 DataFrame 中的值进行排序,我们可以使用 sort!() 函数。 我们需要给出要排序的列。
示例
julia> sort!(testdf, [order(:AW)]) 3×5 DataFrame │ Row │ Number │ Name │ AW │ Symbol │ Discovered │ │ │ Int64 │ String │ Float64 │ String │ Int64? │ ├─────┼────────┼──────────┼─────────┼────────┼────────────┤ │ 1 │ 3 │ Lithium │ 6.941 │ Li │ 1817 │ │ 2 │ 5 │ Boron │ 10.811 │ B │ 1808 │ │ 3 │ 7 │ Nitrogen │ 14.0067 │ N │ 1772 │
DataFrame 根据 AW 列的值进行排序。