Получить имена столбцов из таблицы DataFrame или JuliaDB - PullRequest
2 голосов
/ 27 марта 2020

Как получить имена столбцов из объекта DataFrame или объекта JuliaDB IndexedTable? Возможно ли это?


Воспроизводимый код:
using JuliaDB
import DataFrames
DF = DataFrames

# CREATES AN EXAMPLE TABLE WITH JULIADB

colnames = [:samples, :A, :B, :C, :D]
primary_key = [:samples]
coltypes = [Int[], Float64[],Float64[],Float64[],Float64[]]
sample_sizes = [100,200,300]
example_values = (1, 0.4, 0.3, 0.2, 0.1)

mytable = table(coltypes..., names=colnames, pkey=primary_key) # initialize empty table

# add some data to table
for i in sample_sizes
    example_values = (i, 0.4, 0.3, 0.2, 0.1)
    table_params = [(col=>val) for (col,val) in zip(colnames, example_values)]

    push!(rows(mytable), (; table_params...)) # add row
    mytable = table(mytable, pkey = primary_key, copy = false) # sort rows by primary key
end
mytable = table(unique(mytable), pkey=primary_key) # remove duplicate rows which don't exist

# MAKES A DATAFRAME FROM JULIADB TABLE

df = DF.DataFrame(mytable)

Например, учитывая приведенный выше код, как бы вы проверили с условным условием, если в любом из них есть столбец :E 1010 * или df, (для целей добавления такого столбца, если он еще не существует)?

В конечном счете, я ищу Джулию, эквивалентную следующему Python коду:

if 'E' in df.columns:
     # ...
else:
     # ...

1 Ответ

4 голосов
/ 27 марта 2020

Если df - это фрейм данных, вы можете написать:

if :E in names(df)
...

(в JuliaDB.jl это будет JuliaDB.colnames)

, но быстрее (с точки зрения запуска -time и доступно для фреймов данных:

if hasproperty(df, :E)
...

Немного медленнее, но полезно в других случаях (это также работает для JuliaDB.jl, но сначала вы должны загрузить Tables.jl и записать Tables.columnindex вместо):

if columnindex(df, :E) != 0
...

Последний пример columnindex, вероятно, наиболее сложен, как он работает, описан в его документации:

help?> columnindex
search: columnindex

  Tables.columnindex(table, name::Symbol)

  Return the column index (1-based) of a column by name in a table with a
  known schema; returns 0 if name doesn't exist in table

  ────────────────────────────────────────────────────────────────────────────

  given names and a Symbol name, compute the index (1-based) of the name in
  names
...