Поток управления с именем colum в кадре данных Julia

#dataframe #julia

Вопрос:

Я ищу решение для обработки, когда имя столбца не существует в кадрах данных Julia.

Более подробно, допустим, у меня есть следующие кадры данных и список :

 df = DataFrame(id= "12345", description= rand(5)); err_Li = ["12345"]   

Мне нужно проверить id , соответствует ли столбец err_Li таким, как :

 if (df[1,"id"] in err_Li)  println("NOT VALID") else  end  

Однако в некоторых моих кадрах данных имя столбца id не существует. Так что в Python я могу справиться с try-except такими :

 try :  if df['id'][0] in err_Li:  print('err')  else: pass  except : pass  

Как я могу управлять потоком, если имя столбца не существует в кадре данных Julia или есть эквивалентная функция с try-except в Python ?

Ответ №1:

Поскольку вы знаете и ожидаете, что некоторые из ваших фреймов данных не будут содержать этот столбец, в этом сценарии обычно лучше использовать обычный поток управления ( if else ). Исключения должны быть зарезервированы для исключительных ситуаций.

В этом случае вы можете добавить дополнительное условие к своему if заявлению, например:

 juliagt; df = DataFrame(id= "12345", description= rand(5));  juliagt; if columnindex(df, :id) gt; 0 amp;amp; df[1, :id] in err_Li  println("NOT VALID")  end NOT VALID  juliagt; df2 = DataFrame(blah= "13579", description= rand(5));  juliagt; if columnindex(df2, :id) gt; 0 amp;amp; df2[1, :id] in err_Li  println("NOT VALID")  end  juliagt;   

columnindex это функция, которая принимает фрейм данных и символ ( :id ) и возвращает 0, если Символ не соответствует имени столбца в фрейме данных. Если :id бы он существовал в виде столбца во columnindex фрейме данных, он вернул бы позицию этого столбца (начиная с 1), поэтому в этом случае результат будет больше 0. Таким образом, мы можем использовать его, чтобы проверить, существует ли столбец в нашем фрейме данных, и продолжить проверку значения только в том случае, если столбец существует.

Ответ №2:

В качестве альтернативы приведенному выше ответу вы можете использовать hasproperty тест:

 juliagt; using DataFrames  juliagt; df = DataFrame(id="12345", description=rand(5));  juliagt; propertynames(df) 2-element Vector{Symbol}:  :id  :description  juliagt; hasproperty(df, :id) true  juliagt; hasproperty(df, "id") true  juliagt; hasproperty(df, :x) false  juliagt; hasproperty(df, "x") false  

Причина, по которой это работает, заключается в том, что объекты фрейма данных поддерживают получение своих столбцов с помощью . синтаксиса (который вызывает getproperty ):

 juliagt; df.id 5-element Vector{String}:  "12345"  "12345"  "12345"  "12345"  "12345"  juliagt; df."id" 5-element Vector{String}:  "12345"  "12345"  "12345"  "12345"  "12345"