2014-07-09 3 views
10

Der Typ Dataframe in Julia können Sie es als ein Array zugreifen zu können, so ist es möglich, Spalten über die Indizierung zu entfernen:Julia Datenrahmen: Entfernen Spalte nach Name

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

Das Problem bei diesem Ansatz ist, dass ich oft kenne nur den Namen der Spalte, nicht den Spaltenindex in der Tabelle.

Gibt es eine integrierte Möglichkeit, eine Spalte nach Namen zu entfernen?

Oder gibt es einen besseren Weg, dies zu tun?

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

Das oben genannte ist fehleranfällig; es gibt ein paar Rand Fällen (einzelne Spalte, erste Spalte, letzte Spalte, Symbol nicht in der Tabelle, etc.)

Danke

Antwort

17

Sie delete! verwenden können:

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 | 

Für allgemeinere ops, denken Sie daran, dass Sie auch eine Reihe von Symbolen oder einem Bool-Array übergeben können, und so beliebig komplizierte Auswahlen wie

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 | 

wird auch funktionieren.