#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"