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:按名称删除列的主要内容,如果未能解决你的问题,请参考以下文章
如何在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)