我有一个 Julia 矩阵(当然,如果有帮助的话,我可以将其放入数据框),并且我想删除所有具有 NaN 值的行和列。谷歌似乎没有帮助。在 pandas 中,这是微不足道的:df.dropna().dropna(axis=1)
这是 DataFrames.jl 的答案。要删除具有缺失值的行和列,请分别执行以下操作:
\njulia> using DataFrames\n\njulia> df = DataFrame(a=[1, 2, missing], b=[1, missing, 3], c=[1, 2, 3])\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 a b c\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\xe2\x94\x80\n 1 \xe2\x94\x82 1 1 1\n 2 \xe2\x94\x82 2 missing 2\n 3 \xe2\x94\x82 missing 3 3\n\njulia> dropmissing(df)\n1\xc3\x973 DataFrame\n Row \xe2\x94\x82 a b c\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\n 1 \xe2\x94\x82 1 1 1\n\njulia> df[all.(!ismissing, eachrow(df)), :] # the same using 2-dimensional indexing\n1\xc3\x973 DataFrame\n Row \xe2\x94\x82 a b c\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\n 1 \xe2\x94\x82 1 1 1\n\njulia> select(df, all.(!ismissing, eachcol(df)))\n3\xc3\x971 DataFrame\n Row \xe2\x94\x82 c\n \xe2\x94\x82 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\n 1 \xe2\x94\x82 1\n 2 \xe2\x94\x82 2\n 3 \xe2\x94\x82 3\n\njulia> df[:, all.(!ismissing, eachcol(df))] # the same using 2-dimensional indexing\n3\xc3\x971 DataFrame\n Row \xe2\x94\x82 c\n \xe2\x94\x82 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\n 1 \xe2\x94\x82 1\n 2 \xe2\x94\x82 2\n 3 \xe2\x94\x82 3\nRun Code Online (Sandbox Code Playgroud)\n请注意,删除行比删除列容易得多。原因是 DataFrames.jl 中的设计决策是大多数函数将数据帧视为行的集合,并且dropmissing函数就是这种情况的一个示例。
主要的例外是:
\nselect,transform和combine作用于列的函数对于矩阵来说,这是类似的,但由于它们不像数据框那样偏爱行而不是列,您可以这样做,例如:
\njulia> mat = Matrix(df)\n3\xc3\x973 Array{Union{Missing, Int64},2}:\n 1 1 1\n 2 missing 2\n missing 3 3\n\njulia> mat[all.(!ismissing, eachrow(df)), :]\n1\xc3\x973 Array{Union{Missing, Int64},2}:\n 1 1 1\n\njulia> mat[:, all.(!ismissing, eachcol(df))]\n3\xc3\x971 Array{Union{Missing, Int64},2}:\n 1\n 2\n 3\nRun Code Online (Sandbox Code Playgroud)\n