4.2 Indexação e Sumarização

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 structs 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 Dicts:

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.



CC BY-NC-SA 4.0 Jose Storopoli, Rik Huijzer, Lazaro Alonso