Vamos voltar para o exemplo dos dados grades_2020()
definidos antes:
grades_2020()
name | grade_2020 |
---|---|
Sally | 1.0 |
Bob | 5.0 |
Alice | 8.5 |
Hank | 4.0 |
Para recuperar um vetor para name
, podemos acessar o DataFrame
com o .
, como fizemos anteriormente com struct
s em Section 3:
function names_grades1()
df = grades_2020()
df.name
end
names_grades1()
["Sally", "Bob", "Alice", "Hank"]
ou podemos indexar um DataFrame
de modo muito parecido com uma Array
utilizando símbolos e caracteres especiais. O segundo índice é a indexação da coluna:
function names_grades2()
df = grades_2020()
df[!, :name]
end
names_grades2()
["Sally", "Bob", "Alice", "Hank"]
Perceba que df.name
é exatamente o mesmo que o comando df[!, :name]
, o que você pode verificar fazendo:
julia> df = DataFrame(id=[1]);
julia> @edit df.name
Em ambos os casos, ele dará a coluna :name
. Também existe o comando df[:, :name]
que copia a coluna :name
. Na maioria dos casos, df[!, :name]
é a melhor aposta, pois é mais versátil e faz uma modificação no local.
Para qualquer linha, digamos a segunda linha, podemos usar o primeiro índice como indexação de linha:
df = grades_2020()
df[2, :]
name | grade_2020 |
---|---|
Bob | 5.0 |
ou criar uma função para nos dar qualquer linha i
que quisermos:
function grade_2020(i::Int)
df = grades_2020()
df[i, :]
end
grade_2020(2)
name | grade_2020 |
---|---|
Bob | 5.0 |
Podemos também obter apenas a coluna names
para as 2 primeiras linhas usando fatiamento (novamente, de modo similar a um Array
):
grades_indexing(df) = df[1:2, :name]
grades_indexing(grades_2020())
["Sally", "Bob"]
Se assumirmos que todos os nomes na tabela são únicos, também podemos escrever uma função para obter a nota de uma pessoa por meio de seu name
. Para fazer isso, convertemos a tabela de volta para uma das estruturas de dados básicas de Julia (veja Section 3.2) que é capaz de criar mapeamentos, a saber Dict
s:
function grade_2020(name::String)
df = grades_2020()
dic = Dict(zip(df.name, df.grade_2020))
dic[name]
end
grade_2020("Bob")
5.0
que funciona porque zip
itera pelo df.name
e df.grade_2020
ao mesmo tempo como um “zipper”:
df = grades_2020()
collect(zip(df.name, df.grade_2020))
("Sally", 1.0)
("Bob", 5.0)
("Alice", 8.5)
("Hank", 4.0)
Entretanto, converter um DataFrame
para Dict
só é útil quando os elementos são únicos. Geralmente esse não é o caso e é por isso que precisamos aprender como filter
(filtrar) um DataFrame
.