domingo, 4 de abril de 2021

Como seleciono um subconjunto de um DataFrame?

Este tutorial usa o conjunto de dados do Titanic, armazenado como CSV. Os dados consistem nas seguintes colunas de dados:

  • PassengerId: Id de cada passageiro.
  • Survived: Este recurso tem valores 0 e 1. 0 para não sobreviveu e 1 para sobreviveu.
  • Pclass: Existem 3 classes: Classe 1, Classe 2 e Classe 3.
  • Name: Nome do passageiro.
  • Sex: gênero do passageiro.
  • Age: Idade do passageiro.
  • SibSp: Indicação de que o passageiro tem irmãos e cônjuge.
  • Parch: se o passageiro está sozinho ou tem família.
  • Ticket: Número do bilhete do passageiro.
  • Fare: Indicando a tarifa.
  • Cabin: A cabine do passageiro.
  • Embarked: a categoria embarcada.

O arquivo csv pode ser baixado aqui.

Como seleciono colunas específicas de um DataFrame?

  • Estou interessado na idade dos passageiros do Titanic.

    In [4]: ages = titanic["Age"]
    
    In [5]: ages.head()
    Out[5]: 
    0    22.0
    1    38.0
    2    26.0
    3    35.0
    4    35.0
    Name: Age, dtype: float64
    

    Para selecionar uma única coluna, use colchetes [] com o nome da coluna de interesse.

Cada coluna em um DataFrame é uma Series. Como uma única coluna é selecionada, o objeto retornado é uma Series pandas. Podemos verificar isso verificando o tipo de saída:

In [6]: type(titanic["Age"])
Out[6]: pandas.core.series.Series

E dê uma olhada no shape (forma) da saída:

In [7]: titanic["Age"].shape
Out[7]: (891,)

DataFrame.shape é um atributo (lembre-se do tutorial de leitura e escrita, não use parênteses para atributos) de uma Series pandas e que DataFrame contém o número de linhas e colunas: (nrows, ncolumns). Uma série de pandas é unidimensional e apenas o número de linhas é retornado.

  • Estou interessado na idade e no sexo dos passageiros do Titanic.

    In [8]: age_sex = titanic[["Age", "Sex"]]
    
    In [9]: age_sex.head()
    Out[9]: 
        Age     Sex
    0  22.0    male
    1  38.0  female
    2  26.0  female
    3  35.0  female
    4  35.0    male
    

    Para selecionar várias colunas, use uma lista de nomes de colunas dentro dos colchetes de seleção [].

Observação

Os colchetes internos definem uma lista Python com nomes de colunas, enquanto os colchetes externos são usados para selecionar os dados de um DataFrame pandas, como visto no exemplo anterior.

O tipo de dados retornado é um DataFrame pandas:

In [10]: type(titanic[["Age", "Sex"]])
Out[10]: pandas.core.frame.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)

A seleção retornou um DataFrame com 891 linhas e 2 colunas. Lembre-se de que o DataFrame é bidimensional com dimensão de linha e coluna.

Como posso filtrar linhas específicas de um DataFrame?

  • Estou interessado nos passageiros com mais de 35 anos.

    In [12]: above_35 = titanic[titanic["Age"] > 35]
    
    In [13]: above_35.head()
    Out[13]: 
        PassengerId  Survived  Pclass                                               Name  ...    Ticket     Fare  Cabin  Embarked
    1             2         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  ...  PC 17599  71.2833    C85         C
    6             7         0       1                            McCarthy, Mr. Timothy J  ...     17463  51.8625    E46         S
    11           12         1       1                           Bonnell, Miss. Elizabeth  ...    113783  26.5500   C103         S
    13           14         0       3                        Andersson, Mr. Anders Johan  ...    347082  31.2750    NaN         S
    15           16         1       2                   Hewlett, Mrs. (Mary D Kingcome)   ...    248706  16.0000    NaN         S
    
    [5 rows x 12 columns]
    

    Para selecionar linhas com base em uma expressão condicional, use uma condição dentro dos colchetes de seleção [].

A condição dentro dos colchetes de seleção titanic["Age"] > 35 verifica para quais linhas a coluna Age tem um valor maior que 35:

In [14]: titanic["Age"] > 35
Out[14]: 
0      False
1       True
2      False
3      False
4      False
       ...  
886    False
887    False
888    False
889    False
890    False
Name: Age, Length: 891, dtype: bool

A saída da expressão condicional ( >, mas também ==, !=, <, <=, ... iria funcionar) é realmente uma Series pandas de valores booleanos (quer True ou False) com o mesmo número de linhas que o DataFrame original. Essa Series de valores booleanos podem ser usados para filtrar o DataFrame colocando-o entre os colchetes de seleção []. Apenas as linhas para as quais o valor é True serão selecionadas.

Já sabemos que o DataFrame original Titanic consiste em 891 linhas. Vamos dar uma olhada no número de linhas que satisfazem a condição, verificando o atributo shape do DataFrame above_35:

In [15]: above_35.shape
Out[15]: (217, 12)
  • Estou interessado nos passageiros do Titanic da classe 2 e 3 da cabine.

    In [16]: class_23 = titanic[titanic["Pclass"].isin([2, 3])]
    
    In [17]: class_23.head()
    Out[17]: 
       PassengerId  Survived  Pclass                            Name     Sex  ...  Parch            Ticket     Fare Cabin  Embarked
    0            1         0       3         Braund, Mr. Owen Harris    male  ...      0         A/5 21171   7.2500   NaN         S
    2            3         1       3          Heikkinen, Miss. Laina  female  ...      0  STON/O2. 3101282   7.9250   NaN         S
    4            5         0       3        Allen, Mr. William Henry    male  ...      0            373450   8.0500   NaN         S
    5            6         0       3                Moran, Mr. James    male  ...      0            330877   8.4583   NaN         Q
    7            8         0       3  Palsson, Master. Gosta Leonard    male  ...      1            349909  21.0750   NaN         S
    
    [5 rows x 12 columns]
    

    Semelhante à expressão condicional, a função condicional isin() retorna True para cada linha em que os valores estão na lista fornecida. Para filtrar as linhas com base em tal função, use a função condicional dentro dos colchetes de seleção []. Nesse caso, a condição dentro dos colchetes de seleção titanic["Pclass"].isin([2, 3]) verifica quais linhas da coluna Pclass é 2 ou 3.

O acima é equivalente a filtrar por linhas para as quais a classe é 2 ou 3 e combinar as duas instruções com um operador (ou) |:

In [18]: class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]

In [19]: class_23.head()
Out[19]: 
   PassengerId  Survived  Pclass                            Name     Sex  ...  Parch            Ticket     Fare Cabin  Embarked
0            1         0       3         Braund, Mr. Owen Harris    male  ...      0         A/5 21171   7.2500   NaN         S
2            3         1       3          Heikkinen, Miss. Laina  female  ...      0  STON/O2. 3101282   7.9250   NaN         S
4            5         0       3        Allen, Mr. William Henry    male  ...      0            373450   8.0500   NaN         S
5            6         0       3                Moran, Mr. James    male  ...      0            330877   8.4583   NaN         Q
7            8         0       3  Palsson, Master. Gosta Leonard    male  ...      1            349909  21.0750   NaN         S

[5 rows x 12 columns]

Observação

Ao combinar várias instruções condicionais, cada condição deve estar entre parênteses (). Além disso, você não pode usar or / and você precisa usar o operador or (|) e o operador and (&).

  • Quero trabalhar com dados de passageiros cuja idade é conhecida.

    In [20]: age_no_na = titanic[titanic["Age"].notna()]
    
    In [21]: age_no_na.head()
    Out[21]: 
       PassengerId  Survived  Pclass                                               Name  ...            Ticket     Fare  Cabin  Embarked
    0            1         0       3                            Braund, Mr. Owen Harris  ...         A/5 21171   7.2500    NaN         S
    1            2         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  ...          PC 17599  71.2833    C85         C
    2            3         1       3                             Heikkinen, Miss. Laina  ...  STON/O2. 3101282   7.9250    NaN         S
    3            4         1       1       Futrelle, Mrs. Jacques Heath (Lily May Peel)  ...            113803  53.1000   C123         S
    4            5         0       3                           Allen, Mr. William Henry  ...            373450   8.0500    NaN         S
    
    [5 rows x 12 columns]
    

    A função condicional notna() retorna True para cada linha, os valores não são um Nullvalor. Como tal, isso pode ser combinado com os colchetes de seleção []para filtrar a tabela de dados.

Você pode se perguntar o que realmente mudou, já que as 5 primeiras linhas ainda são os mesmos valores. Uma maneira de verificar é verificar se a forma mudou:

In [22]: age_no_na.shape
Out[22]: (714, 12)

Como seleciono linhas e colunas específicas de um DataFrame?

  • Estou interessado nos nomes dos passageiros com mais de 35 anos.

    In [23]: adult_names = titanic.loc[titanic["Age"] > 35, "Name"]
    
    In [24]: adult_names.head()
    Out[24]: 
    1     Cumings, Mrs. John Bradley (Florence Briggs Th...
    6                               McCarthy, Mr. Timothy J
    11                             Bonnell, Miss. Elizabeth
    13                          Andersson, Mr. Anders Johan
    15                     Hewlett, Mrs. (Mary D Kingcome) 
    Name: Name, dtype: object
    

    Neste caso, um subconjunto de linhas e colunas é feito de uma vez e apenas usar colchetes de seleção [] não é mais suficiente. Os operadores loc / iloc são necessários na frente dos colchetes de seleção []. Ao usar loc / iloc, a parte antes da vírgula são as linhas que você deseja e a parte depois da vírgula são as colunas que você deseja selecionar.

Ao usar os nomes das colunas, rótulos de linha ou uma expressão de condição, use o operador loc na frente dos colchetes de seleção []. Para a parte antes e depois da vírgula, você pode usar um único rótulo, uma lista de rótulos, uma fatia de rótulos, uma expressão condicional ou dois pontos. Usar dois pontos especifica que você deseja selecionar todas as linhas ou colunas.

  • Estou interessado nas linhas 10 a 25 e nas colunas 3 a 5.

    In [25]: titanic.iloc[9:25, 2:5]
    Out[25]: 
        Pclass                                 Name     Sex
    9        2  Nasser, Mrs. Nicholas (Adele Achem)  female
    10       3      Sandstrom, Miss. Marguerite Rut  female
    11       1             Bonnell, Miss. Elizabeth  female
    12       3       Saundercock, Mr. William Henry    male
    13       3          Andersson, Mr. Anders Johan    male
    ..     ...                                  ...     ...
    20       2                 Fynney, Mr. Joseph J    male
    21       2                Beesley, Mr. Lawrence    male
    22       3          McGowan, Miss. Anna "Annie"  female
    23       1         Sloper, Mr. William Thompson    male
    24       3        Palsson, Miss. Torborg Danira  female
    
    [16 rows x 3 columns]
    

    Novamente, um subconjunto de linhas e colunas é feito de uma vez e apenas usar colchetes de seleção [] não é mais suficiente. Quando estiver especificamente interessado em certas linhas e / ou colunas com base em sua posição na tabela, use o operador iloc na frente dos colchetes de seleção [].

Ao selecionar linhas e / ou colunas específicas com loc ou iloc, novos valores podem ser atribuídos aos dados selecionados. Por exemplo, para atribuir o nome anonymous aos 3 primeiros elementos da terceira coluna:

In [26]: titanic.iloc[0:3, 3] = "anonymous"

In [27]: titanic.head()
Out[27]: 
   PassengerId  Survived  Pclass                                          Name  ...            Ticket     Fare  Cabin  Embarked
0            1         0       3                                     anonymous  ...         A/5 21171   7.2500    NaN         S
1            2         1       1                                     anonymous  ...          PC 17599  71.2833    C85         C
2            3         1       3                                     anonymous  ...  STON/O2. 3101282   7.9250    NaN         S
3            4         1       1  Futrelle, Mrs. Jacques Heath (Lily May Peel)  ...            113803  53.1000   C123         S
4            5         0       3                      Allen, Mr. William Henry  ...            373450   8.0500    NaN         S

[5 rows x 12 columns]

LEMBRAR

  • Ao selecionar subconjuntos de dados, colchetes [] são usados.

  • Dentro desses colchetes, você pode usar um único rótulo de coluna / linha, uma lista de rótulos de coluna / linha, uma fatia de rótulos, uma expressão condicional ou dois pontos.

  • Selecione linhas e / ou colunas específicas usando loc ao usar os nomes de linha e coluna.

  • Selecione linhas e / ou colunas específicas usando iloc ao usar as posições na tabela.

  • Você pode atribuir novos valores a uma seleção com base em loc / iloc.

Traduzido por Acervo Lima. O original pode ser acessado aqui.

0 comentários:

Postar um comentário