Categorias
Análise de Dados Dataframes Pandas

10 funções mais usadas para manipular dataframes no Pandas

O Pandas é uma das bibliotecas mais utilizadas para analisar dados em Python, além de ser uma ferramenta poderosa, flexível e confiável para muitos analistas de dados. Existem algumas funções conhecidas, bem como técnicas não tão formais que podem tornar a vida mais fácil para qualquer analista de dados, seja ele um profissional ou um entusiasta.

Neste artigo, serão discutidas algumas funções úteis e técnicas significativas, todas  com exemplos. Com certeza você já usou algumas dessas funções com frequência, mas elas podem não ser tão familiares para todos. No geral, você enriquecerá suas habilidades em Análise de Dados.

No decorrer deste artigo você verá as seguintes funções:

  • unique e nunique 
  • describe
  • sort_values
  • value_counts
  • isnull 
  • fillna 
  • groupby 
  • map e seu uso para codificação categórica
  • apply e lambda
  • pivot
Vamos começar

Antes de usar as funções mencionadas acima, você pode criar um dataframe usando o dataset Kaggle Titanic, você pode baixá-lo aqui . Dessa forma, uma variedade de opções pode ser explorada. Como alternativa, qualquer conjunto de dados de código aberto pode ser usado para a prática.

 

1.  unique e nunique

A função unique no Pandas retorna uma lista dos elementos únicos com base na ocorrência. Esta função é mais rápida do que a unique do NumPy e também inclui valores NaN. Isso é particularmente útil para verificar os diferentes valores em um campo categórico.

data['Embarked'].unique()

Saída:

array (['S', 'C', 'Q', nan], dtype = objeto)

A função Nunique, por outro lado, conta os valores distintos das colunas. Os valores NaN podem ser ignorados. Isso mostra apenas o número de categorias diferentes presentes em uma coluna de um dataframe.

data['Embarked'].nunique()

Saída: 3

 

2. describe

Esta função mostra estatísticas descritivas, como média, desvio padrão, máximo, mínimo e outras tendências centrais, além da forma da distribuição. Isso exclui os valores NaN do resumo. Isso é útil para se ter uma ideia sobre a distribuição dos campos de dados e outliers, se houver. O percentil da saída pode ser personalizado mencionando a faixa de percentis no parâmetro da função.

data.describe()

data.describe()

 

Saída:

3. sort_values

Esta função altera a ordem dos valores em uma coluna classificando-a. Portanto, podemos usar isso para mostrar o dataset de acordo com nossa necessidade, classificando em ordem crescente ou decrescente.

Podemos definir o parâmetro “ascending” verdadeiro ou falso, que por padrão é verdadeiro. Também podemos alterar a classificação por índice ou coluna definindo o parâmetro “eixo” 0 ou 1. Além disso, podemos classificar várias colunas mencionando-as em uma lista, por exemplo:

(e.g. data.sort_values(by=[‘Age’,’Pclass’, ascending=[False,True])
data.sort_values(by='Age',ascending=False)

Saída:

 

4. value_counts

Esta função retorna o valor da contagem para cada item exclusivo presente na coluna. Os valores são exibidos em ordem decrescente para que o elemento mais frequente venha primeiro. Isso exclui os valores nulos. Aqui, veremos o número de homens e mulheres a bordo em diferentes classes, chamando a função value_counts () da seguinte maneira:

data[['Pclass','Sex']].value_counts()

 

Saída:

5. isnull 

Esta função descobre se há algum valor ausente presente em um objeto do tipo array. Esta função retorna valores booleanos após verificar os valores ausentes. Estamos criando uma lista com um valor nulo e quando ela é passada pela função isnull (), ela dá saída com uma lista booleana.

Isso também pode ser útil quando verificamos se há valores ausentes em um grande dataframe. Podemos calcular o número total de valores ausentes de uma coluna adicionando a função sum () ao final da função isnull (). Aqui, pegamos nosso dataset  e verificamos para cada coluna se há algum valor ausente e mostramos o mesmo.

 

#tirando cada coluna do dataframe

forcolindata.columns:

#verificando se há algum nulo na coluna

ifdata[col].isnull().sum()>0:

#se for nulo, número total de nulos nas colunas armazenadas

total_null=data[col].isnull().sum() print('Column{}hastotalnull{},i.e.{}%'.format(col,total_null,round(total_null*100/len(data),2)))

 

Saída:

 

6. fillna

Esta função é usada para preencher os valores ausentes com base no método especificado. Fillna usa parâmetros como valor (um valor que é usado para preencher o valor ausente) e método (como bfill, ffill, etc). Em nosso conjunto de dados de exemplo, o campo “Idade” tem um total de 177 valores ausentes. Vamos preenchê-lo com a mediana de “Idade” usando a função fillna ().

 

data['Age'].fillna(value=data['Age'].median(),inplace=True)
data['Age'].isnull().sum()

Saída: 0

O parâmetro “valor” de fillna () também pode ser obtido de outro groupby complexo ou dataframe ou dicionário.

 

7. groupby 

A função Pandas groupby( ) é usada para dividir os dados e ajudar a aplicação de alguma função a eles e no final combinar o resultado para outro objeto. Frequentemente precisamos dividir os dados e aplicar alguma agregação (por exemplo, soma, média, contagem, etc.) ou transformá-los (por exemplo, para preencher valores ausentes ou padronizar dados), a função groupby é útil nessas situações.

 

# queremos ver para cada campo de gênero máximo, mínimo, média e mediana de idade

data.groupby(['Sex'])['Age'].agg(['max','min','mean','median'])

Saída:

 

8. map 

A função map ( ) no Pandas é usada para mapear séries e substituir valores de uma série por outro valor associado a um dicionário, série ou função. Esta função é frequentemente usada para substituir valores de uma coluna de um dataframe ou uma série, mas lembre-se que todos os valores têm de ser do mesmo tipo!

Em nosso dataset, suponha que queremos converter o campo de gênero em um campo binário, ou seja, substituir “masculino” pelo valor 1 e feminino pelo valor 0. O mesmo pode ser feito facilmente da seguinte maneira:

data['Sex'].head()

 

Saída:

#crie um dicionário para substituir os valores
gender = {'male':1, 'female':0}
#chame a função map e passe o dicionário para mapear os valores da coluna
data['Sex'].map(gender).head()

 

Saída:

 

9. apply

A função apply() no Pandas certamente é uma das funções mais versáteis entre todas. Nós podemos utilizar uma função apply() e ela se aplicará a todo o dataframe (ou a uma série particular). Isso ajuda a modificar os dados de acordo com a condição de uma maneira muito flexível. Vamos ver um exemplo simples, aqui temos um dataframe e uma das colunas tem marcas que queremos converter em uma porcentagem.

df=pd.DataFrame({'Name':['X','Y','Z'],'Marks':[150,120,175]})
df

 

Saída:

def percentage_marks(x):
return x/2
df['Marks'].apply(percentage_marks)

 

Saída:

Aplicar função também pode ser usada com função anônima ou função lambda. Suponha que tenhamos que converter um campo contínuo como “idade” em uma coluna de faixa etária diferente ou converter um campo categórico em um campo codificado por rótulo e, em seguida, aplicar a função junto com a função lambda é muito útil nessas situações.

data['Age_bin']=data['Age'].apply(lambda x : 1 if x<=30 else
(2 if x>30 and x<=45 else</pre>
 (3 if x>45 and x<=60 else 4)))

 

A coluna Age_bin será criada da seguinte forma

 

10. pivot

A função pivot remodela o dataset por valores de índice ou coluna. Essa função é basicamente semelhante à tabela dinâmica. Ele usa o valor exclusivo de uma coluna para formar um índice de um dataset. Ao contrário da função groupby, o pivot não oferece suporte à agregação de dados. Veja exemplo abaixo:

df=pd.DataFrame({'Class':['1st','2nd','3rd','1st','2nd','3rd'],'Section':</pre>
<pre>['A','A','A','B','B','B'],'Gr':[1,2,3,4,5,6]})</pre>
<pre>df

 

Saída:

 

df.pivot(index='Class',columns='Section',values='Gr')

 

Saída:

__  __  __

 

Esperamos que estas funções contribuam ainda mais na sua Análise de Dados, especialmente para você que está iniciando no  mundo do Python e Pandas. Acompanhe o nosso blog para saber sempre mais!

Artigo original, Analytics Vidhya

 

Categorias
Pandas Programação Python

6 truques do Pandas para impulsionar sua análise de dados

O Pandas é uma das melhores bibliotecas Python para análise de dados. Esta biblioteca open source oferece estrutura de dados de alto nível com um excelente desempenho para simplificar tarefas complicadas de manipulação de dados. Sua grande variedade de ferramentas possibilita traduzir operações complexas com dados em um ou dois comandos, além de possuir métodos internos para agrupar, filtrar e combinar dados.

 

Conheça agora, os seis truques mais úteis dos Pandas para acelerar sua análise de dados.

 

  1. Selecionar colunas por tipo de dados;
  2. Converter cadeias de caracteres em números;
  3. Detectar e manipular valores ausentes;
  4. Converter um recurso numérico contínuo em um recurso categórico;
  5. Criar um DataFrame a partir da área de transferência;
  6. Construir um DataFrame a partir de vários arquivos.

Confira aqui o repositório no Github para obter o código-fonte.

 

1. Selecione colunas por tipos de dados

Aqui estão os tipos de dados do DataFrame Titanic:

df.dtypes

 

PassengerId int64

Survived int64

Pclass int64

Name object

Sex object

Age float64

SibSp int64

Parch int64

Ticket object

Fare float64

Cabin object

Embarked object

dtype: object

 

Digamos que você precise selecionar as colunas numéricas.

df.select_dtypes(include='number').head()

 

Isso inclui as colunas int e float. Você também pode usar esse método para:

 

  • selecionar apenas colunas de objeto;
  • selecionar vários tipos de dados;
  • excluir certos tipos de dados.

 

# select just object columns

df.select_dtypes(include='object')

 

# select multiple data types

df.select_dtypes(include=['int', 'datetime', 'object'])

 

# exclude certain data types

df.select_dtypes(exclude='int')

 

2. Converta sequências de caracteres em números

 

Existem dois métodos para converter uma string em números no Pandas:

  • O método astype()
  • O método to_numeric()

Vamos criar um exemplo de DataFrame para ver a diferença.

df = pd.DataFrame({ 'product': ['A','B','C','D'],

                 'price': ['10','20','30','40'], 

                'sales': ['20','-','60','-'] 

                })

 

 

As colunas de price e sales são armazenadas como uma cadeia de caracteres e, portanto, resultam em colunas de objeto:

df.dtypes

 

product    object

price      object

sales      object

dtype: object

 

Podemos usar o primeiro método astype()para realizar a conversão na coluna de price da seguinte maneira:

 

# Use Python type

df['price'] = df['price'].astype(int)

 

# alternatively, pass { col: dtype }

df = df.astype({'price': 'int'})

 

No entanto, isso resultaria em um erro se tentássemos usá-lo na coluna de sales. Para consertar isso, podemos usar to_numeric() com o argumento errors='coerce'.

 

df['sales'] = pd.to_numeric(df['sales'], errors='coerce')

 

Agora, valores inválidos são convertidos para  NaN e o tipo de dado é float.

 

3. Detectar e manipular valores ausentes

Uma maneira de detectar valores ausentes é usar o método info(). Veja na coluna Non-Null Count.

df.info()

 

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

#   Column       Non-Null Count  Dtype 

---  ------       --------------  ----- 

0   PassengerId  891 non-null    int64 

1   Survived     891 non-null    int64 

2   Pclass       891 non-null    int64 

3   Name         891 non-null    object

4   Sex          891 non-null    object

5   Age          714 non-null    float64

6   SibSp        891 non-null    int64 

7   Parch        891 non-null    int64 

8   Ticket       891 non-null    object

9   Fare         891 non-null    float64

10  Cabin        204 non-null    object

11  Embarked     889 non-null    object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.7+ KB

 

Quando o conjunto de dados é grande, podemos contar o número de valores ausentes. df.isnull().sum() retorna o número de valores ausentes para cada coluna.

 

df.isnull().sum()

 

PassengerId      0

Survived         0

Pclass           0

Name             0

Sex              0

Age            177

SibSp            0

Parch            0

Ticket           0

Fare             0

Cabin          687

Embarked         2

dtype: int64

 

df.isnull().sum().sum() retorna o número total de valores ausentes.

 

df.isnull().sum().sum()

 

886

 

Além disso, também podemos descobrir a porcentagem de valores que estão faltando, executando: df.isna().mean()

 

PassengerId    0.000000

Survived       0.000000

Pclass         0.000000

Name           0.000000

Sex            0.000000

Age            0.198653

SibSp          0.000000

Parch          0.000000

Ticket         0.000000

Fare           0.000000

Cabin          0.771044

Embarked       0.002245

dtype: float64

 

Eliminando valores ausentes

 

Para descartar linhas se houver algum valor NaN:

df.dropna(axis = 0)

Para descartar colunas se houver algum valor NaN:

df.dropna(axis = 1)

Para descartar colunas nas quais mais de 10% dos valores estão ausentes:

df.dropna(thresh=len(df)*0.9, axis=1)

 

Substituindo valores ausentes

 

Para substituir todos os valores de NaN por um escalar:

df.fillna(value=10)

Para substituir os valores de NaN pelos valores da linha anterior:

df.fillna(axis=0, method='ffill')

Para substituir os valores de NaN pelos valores da coluna anterior:

df.fillna(axis=1, method='ffill')

Você também pode substituir os valores de NaN pelos valores da próxima linha ou coluna:

# Replace with the values in the next row

df.fillna(axis=0, method='bfill')

# Replace with the values in the next column

df.fillna(axis=1, method='bfill')

 

A outra substituição comum é trocar os valores de NaN pela média. Por exemplo, para substituir os valores de NaN na coluna Idade pela média.

 

df['Age'].fillna(value=df['Age'].mean(), inplace=True)

 

4. Converta um recurso numérico contínuo em um recurso categórico

 

Na etapa de preparação dos dados, é bastante comum combinar ou transformar recursos existentes para criar outro mais útil. Uma das maneiras mais populares é criar um recurso categórico a partir de um recurso numérico contínuo.

 

Observe a coluna Age do dataset do Titanic:

 

df['Age'].head(8)

 

0    22.0

1    38.0

2    26.0

3    35.0

4    35.0

5     NaN

6    54.0

7     2.0

Name: Age, dtype: float64

 

Age é um atributo numérico contínuo, mas se você desejar convertê-la em um atributo categórico, por exemplo, converta as idades em grupos de faixas etárias: ≤12, Teen (≤18), Adult (≤60) e Older (>60).

 

A melhor maneira de fazer isso é usando a função Pandas cut():

 

import sys

 

df['ageGroup']=pd.cut(

   df['Age'],

   bins=[0, 13, 19, 61, sys.maxsize],

   labels=['<12', 'Teen', 'Adult', 'Older']

)

 

Usar a função head(),na coluna age Group, deverá exibir as informações da coluna.

df['ageGroup'].head(8)

 

0    Adult

1    Adult

2    Adult

3    Adult

4    Adult

5      NaN

6    Adult

7      <12

Name: ageGroup, dtype: category

Categories (4, object): [<12 < Teen < Adult < Older]

 

5. Crie um DataFrame a partir da área de transferência

 

A função Pandas read_clipboard() é uma maneira muito útil de inserir dados em um DataFrame de forma rápida..

Suponha que tenhamos os seguintes dados e desejemos criar um DataFrame a partir dele:

 

    product   price

0    A         10

1    B         20

2    C         30

4    D         40

 

Só precisamos selecionar os dados e copiá-los para a área de transferência. Então, podemos usar a função para ler um DataFrame.

 

df = pd.read_clipboard ()

df

 

6. Crie um DataFrame a partir de vários arquivos

Seu dataset pode se espalhar por vários arquivos, mas você pode querer lê-lo em um único DataFrame.

Uma maneira de fazer isso é ler cada arquivo em seu próprio DataFrame, combiná-los e excluir o DataFrame original. Porém, isso seria ineficiente em memória.

Uma solução melhor é usar o módulo interno glob  (graças aos truques do Data School Pandas).

 

Neste caso, glob() estará procurando no diretório de dados, todos os arquivos CSV que começam com a palavra ” data_row_ “. O glob()recupera nomes de arquivos em uma ordem arbitrária, e é por isso que classificamos a lista usando a função sort().

 

Para dados em linha

Digamos que nosso dataset esteja distribuído por 2 arquivos em linhas: data_row_1.csv e data_row_2.csv.

 

Para criar um DataFrame a partir dos 2 arquivos:

 

files = sorted(glob('data/data_row_*.csv'))

pd.concat((pd.read_csv(file) for file in files), ignore_index=True)

 

sorted(glob('data/data_row_*.csv')) recupera nomes de arquivos. Depois disso, lemos cada um dos arquivos usando read_csv()e passamos os resultados para a função concat(), que conectará as linhas em um único DataFrame. Além disso, para evitar um valor duplicado no índice, dizemos ao concat()que ignore o index (ignore_index=True) e, em vez disso, use o índice inteiro padrão.

 

 

Para dados em colunas

Digamos que nosso dataset esteja distribuído em 2 arquivos em colunas: data_col_1.csv e data_col_2.csv.

 

Para criar um DataFrame a partir dos 2 arquivos:

files = sorted(glob('data/data_col_*.csv'))

pd.concat((pd.read_csv(file) for file in files), axis=1)

Desta vez, dizemos à função concat() para conectar ao longo do eixo das colunas.

————-

Isso é tudo!

Obrigada pela leitura e continue acompanhando nossos postagens em Data Science.

 

Texto original: B. Chen

 

 

Sair da versão mobile