web-dev-qa-db-ja.com

Julia DataFrame:名前で列を削除

JuliaのDataFrameタイプを使用すると、配列としてアクセスできるため、インデックスを使用して列を削除できます。

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

このアプローチの問題は、テーブル内の列インデックスではなく、列の名前しか知らないことが多いことです。

名前で列を削除する組み込みの方法はありますか?

あるいは、これよりも良い方法はありますか?

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

上記は失敗しがちです。いくつかのエッジケースがあります(単一の列、最初の列、最後の列、テーブルにないシンボルなど)

ありがとうございました

18
Mageek

delete!を使用できます:

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> delete!(df, :B)
4x2 DataFrame
|-------|---|---|
| Row # | A | C |
| 1     | 1 | 2 |
| 2     | 2 | 3 |
| 3     | 3 | 4 |
| 4     | 4 | 5 |

より一般的な操作については、Symbolsの配列またはbool配列も渡すことができるため、次のような任意に複雑な選択を行うことができます。

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 |

また動作します。

26
DSM

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     │
3
David J.

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     │
1
LyxUser12345