按没有“缺失”值的行过滤 DataFrame

Mor*_*eu5 2 dataframe julia

我有一个可能包含缺失值的 DataFrame,并且我想过滤掉至少包含一个缺失值的所有行,因此从此

\n
DataFrame(a = [1, 2, 3, 4], b = [5, missing, 7, 8], c = [9, 10, missing, 12])\n4\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        5        9\n   2 \xe2\x94\x82     2  missing       10\n   3 \xe2\x94\x82     3        7  missing\n   4 \xe2\x94\x82     4        8       12\n
Run Code Online (Sandbox Code Playgroud)\n

我想要类似的东西

\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        5        9\n   4 \xe2\x94\x82     4        8       12\n
Run Code Online (Sandbox Code Playgroud)\n

理想情况下,会有一个过滤器函数,我可以将每一行传递给 lambda,然后执行collectandfindfirst以及诸如此类的组合,但我不知道如何将 lambda 传递给subsetor @subset(从 DataFramesMeta),因为我不知道只有三栏,我有超过200栏。

\n

Bog*_*ski 6

按照@Antonello所说,你可以这样做dropmissing. 您有三个选择:

\n
    \n
  • dropmissing:创建一个新的数据框,删除带有缺失值的行;
  • \n
  • dropmissingview=true源数据框的视图,其中删除了带有缺失值的行;
  • \n
  • dropmissing!删除丢失值的行。
  • \n
\n

默认情况下,会考虑所有列,但您可以更改它并传递一个列选择器,指定要在检查中包含哪些列。

\n

最后,默认情况下,删除带有缺失值的行后,列将更改为eltype不允许缺失值,但您可以通过传递来更改此行为disallowmissing=false在这种情况下它们仍然允许它们。

\n

subset以下是如何使用和执行过滤ismissing

\n
julia> subset(df, All() .=> ByRow(!ismissing))\n2\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       5       9\n   2 \xe2\x94\x82     4       8      12\n
Run Code Online (Sandbox Code Playgroud)\n

(我正在使用标准selectDataFrames.jl 中的标准)

\n

或者如果您有一个非常宽的数据框(例如数千列):

\n
subset(df, AsTable(All()) => ByRow((x -> all(!ismissing, x))\xe2\x88\x98collect))\n
Run Code Online (Sandbox Code Playgroud)\n

(这是一种针对宽表的快速行式聚合而优化的特殊语法)

\n