如何删除在特定列中具有 NA 的 DataFrame 的所有行?

How can I delete all rows of a DataFrame that have an NA in a specific column?

删除 DataFrame 中特定列中具有 NA 值的所有行的最优雅方法是什么?

假设 df 是您的 DataFrame,A 是缺少值的列。你可以这样做:

nonmissingrows = findin(isna(df[:A]), false)
df = df[nonmissingrows, :]

我不知道以下是否是删除特定列中具有 NA 的所有行的最优雅方法,但这是 一个 方法。

正在生成玩具 DataFrame

julia> df = DataFrame(A = 1:10, B = 2:2:20)
10x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 1  | 2  |
| 2   | 2  | 4  |
| 3   | 3  | 6  |
| 4   | 4  | 8  |
| 5   | 5  | 10 |
| 6   | 6  | 12 |
| 7   | 7  | 14 |
| 8   | 8  | 16 |
| 9   | 9  | 18 |
| 10  | 10 | 20 |

julia> df[[1,4,8],symbol("B")] = NA
NA

julia> df
10x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 1  | NA |
| 2   | 2  | 4  |
| 3   | 3  | 6  |
| 4   | 4  | NA |
| 5   | 5  | 10 |
| 6   | 6  | 12 |
| 7   | 7  | 14 |
| 8   | 8  | NA |
| 9   | 9  | 18 |
| 10  | 10 | 20 |

过滤掉"B"列元素为NA

的行
julia> df[~isna(df[:,symbol("B")]),:]
7x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 2  | 4  |
| 2   | 3  | 6  |
| 3   | 5  | 10 |
| 4   | 6  | 12 |
| 5   | 7  | 14 |
| 6   | 9  | 18 |
| 7   | 10 | 20 |

julia> df
10x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 1  | NA |
| 2   | 2  | 4  |
| 3   | 3  | 6  |
| 4   | 4  | NA |
| 5   | 5  | 10 |
| 6   | 6  | 12 |
| 7   | 7  | 14 |
| 8   | 8  | NA |
| 9   | 9  | 18 |
| 10  | 10 | 20 |

删除 "B"-列元素为 NA

的行
julia> deleterows!(df,find(isna(df[:,symbol("B")])))
7x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 2  | 4  |
| 2   | 3  | 6  |
| 3   | 5  | 10 |
| 4   | 6  | 12 |
| 5   | 7  | 14 |
| 6   | 9  | 18 |
| 7   | 10 | 20 |

julia> df
7x2 DataFrame
| Row | A  | B  |
|-----|----|----|
| 1   | 2  | 4  |
| 2   | 3  | 6  |
| 3   | 5  | 10 |
| 4   | 6  | 12 |
| 5   | 7  | 14 |
| 6   | 9  | 18 |
| 7   | 10 | 20 |
using Lazy
using DataFramesMeta
df2 = @> df @where(!isna(:B))
  • @> 来自 Lazy.jl 包,它基本上将 df @where(!isna(:B)) 重写为 @where(df, !isna(:B))

  • @whereDataFramesMeta 包提供。第二个参数基本上是一个布尔值列表,其中应该保留哪些行,哪些不应该保留。这些函数的特殊之处在于 :B 可以作为 df[:B]

  • 的简写

要删除所有包含 NA 值的行,简单 运行 这个,假设 df 是一个数据帧:

completecases!(df)