Julia DataFrame:按名称删除列

Posted

技术标签:

【中文标题】Julia DataFrame:按名称删除列【英文标题】:Julia DataFrame: remove column by name 【发布时间】:2014-08-31 04:09:07 【问题描述】:

Julia 中的 DataFrame 类型允许您将其作为数组访问,因此可以通过索引删除列:

df = df[:,[1:2,4:end]] # remove column 3

这种方法的问题是我经常只知道列的名称,而不知道它在表中的列索引。

是否有按名称删除列的内置方法?

或者,还有比这更好的方法吗?

colind = findfirst(names(df), colsymbol)
df = df[:,[1:colind-1,colind+1:end]]

以上是容易失败的;有一些边缘情况(单列、第一列、最后一列、表中没有的符号等)

谢谢

【问题讨论】:

使用columnindex(df, :your_column_symbol)访问列索引 【参考方案1】:

你可以使用select!:

julia> df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"], C = 2:5)
4x3 DataFrame
|-------|---|-----|---|
| Row # | A | B   | C |
| 1     | 1 | "M" | 2 |
| 2     | 2 | "F" | 3 |
| 3     | 3 | "F" | 4 |
| 4     | 4 | "M" | 5 |

julia> select!(df, Not(:B))
4x2 DataFrame
|-------|---|---|
| Row # | A | C |
| 1     | 1 | 2 |
| 2     | 2 | 3 |
| 3     | 3 | 4 |
| 4     | 4 | 5 |

对于更一般的操作,请记住,您也可以传递符号数组或布尔数组,以及任意复杂的选择,例如

julia> df[~[(x in [:B, :C]) for x in names(df)]]
4x1 DataFrame
|-------|---|
| Row # | A |
| 1     | 1 |
| 2     | 2 |
| 3     | 3 |
| 4     | 4 |

julia> df[setdiff(names(df), [:C])]
4x1 DataFrame
|-------|---|
| Row # | A |
| 1     | 1 |
| 2     | 2 |
| 3     | 3 |
| 4     | 4 |

也可以。

【讨论】:

请注意,此示例不适用于 Julia 0.21.0 / DataFrames 1.3.1。 @LyxUser12345 使用 select! 的答案确实有效。 请修改答案,因为它不再是最新的。【参考方案2】:

由于delete! 引发了建议使用select! 的弃用警告:

julia> d = DataFrame(a=1:3, b=4:6)
3×2 DataFrame
│ Row │ a     │ b     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 4     │
│ 2   │ 2     │ 5     │
│ 3   │ 3     │ 6     │

julia> select!(d, Not(:a))
3×1 DataFrame
│ Row │ b     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 4     │
│ 2   │ 5     │
│ 3   │ 6     │

【讨论】:

删除!也会引发警告。【参考方案3】:

从 Julia 1.0 开始,您需要使用 deletecols!

https://juliadata.github.io/DataFrames.jl/stable/lib/functions.html#DataFrames.deletecols!

julia> d = DataFrame(a=1:3, b=4:6)
3×2 DataFrame
│ Row │ a     │ b     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 4     │
│ 2   │ 2     │ 5     │
│ 3   │ 3     │ 6     │

julia> deletecols!(d, 1)
3×1 DataFrame
│ Row │ b     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 4     │
│ 2   │ 5     │
│ 3   │ 6     │

【讨论】:

deletecols! 自 Julia 1.3.1 起已贬值,@LyxUser12345 使用 select! 的答案确实有效。 .. 对我来说,“删除”操作的“删除”键名似乎比“选择(非())”更直接:-/

以上是关于Julia DataFrame:按名称删除列的主要内容,如果未能解决你的问题,请参考以下文章

在 Julia 中加入 DataFrame

如何在pandas DataFrame中选择和删除具有重复名称的列

Julia:将 DataFrame 传递给函数会创建指向 DataFrame 的指针?

pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)

pandas使用rstrip函数删除dataframe中数据列名称的共同后缀(remove suffix from column labels in dataframe)

pandas使用duplicated函数删除dataframe中重复列名称的数据列默认保留重复数据列中的第一个数据列(removing duplicate columns in dataframe)