Python Pandas - Guia rápido

Pandas é uma biblioteca Python de código aberto que fornece manipulação de dados de alto desempenho e ferramenta de análise usando suas poderosas estruturas de dados. O nome Pandas é derivado da palavra Panel Data - uma Econometria de dados multidimensionais.

Em 2008, o desenvolvedor Wes McKinney começou a desenvolver pandas quando precisava de uma ferramenta flexível de alto desempenho para análise de dados.

Antes do Pandas, o Python era usado principalmente para preparação e preparação de dados. Teve muito pouca contribuição para a análise de dados. O Pandas resolveu esse problema. Usando o Pandas, podemos realizar cinco etapas típicas no processamento e análise de dados, independentemente da origem dos dados - carregar, preparar, manipular, modelar e analisar.

Python com Pandas é usado em uma ampla variedade de campos, incluindo domínios acadêmicos e comerciais, incluindo finanças, economia, estatística, análise, etc.

Principais recursos do Pandas

  • Objeto DataFrame rápido e eficiente com indexação padrão e personalizada.
  • Ferramentas para carregar dados em objetos de dados na memória de diferentes formatos de arquivo.
  • Alinhamento de dados e tratamento integrado de dados ausentes.
  • Remodelagem e rotação de conjuntos de datas.
  • Fatiamento baseado em rótulo, indexação e subconjunto de grandes conjuntos de dados.
  • As colunas de uma estrutura de dados podem ser excluídas ou inseridas.
  • Agrupe por dados para agregação e transformações.
  • Mesclagem e junção de dados de alto desempenho.
  • Funcionalidade de série temporal.

A distribuição padrão do Python não vem com o módulo Pandas. Uma alternativa leve é ​​instalar o NumPy usando o instalador de pacote Python popular,pip.

pip install pandas

Se você instalar o pacote Anaconda Python, o Pandas será instalado por padrão com o seguinte -

janelas

  • Anaconda (por https://www.continuum.io) é uma distribuição Python gratuita para a pilha SciPy. Também está disponível para Linux e Mac.

  • Canopy (https://www.enthought.com/products/canopy/) está disponível como distribuição gratuita e comercial com pilha SciPy completa para Windows, Linux e Mac.

  • Python(x, y) é uma distribuição Python gratuita com pilha SciPy e Spyder IDE para Windows OS. (Pode ser baixado dehttp://python-xy.github.io/)

Linux

Os gerenciadores de pacotes das respectivas distribuições Linux são usados ​​para instalar um ou mais pacotes na pilha SciPy.

For Ubuntu Users

sudo apt-get install python-numpy python-scipy python-matplotlibipythonipythonnotebook
python-pandas python-sympy python-nose

For Fedora Users

sudo yum install numpyscipy python-matplotlibipython python-pandas sympy
python-nose atlas-devel

O Pandas lida com as três estruturas de dados a seguir -

  • Series
  • DataFrame
  • Panel

Essas estruturas de dados são construídas em cima do array Numpy, o que significa que são rápidas.

Dimensão e descrição

A melhor maneira de pensar nessas estruturas de dados é que a estrutura de dados de dimensão superior é um contêiner de sua estrutura de dados de dimensão inferior. Por exemplo, DataFrame é um contêiner de Series, Panel é um contêiner de DataFrame.

Estrutura de dados Dimensões Descrição
Series 1 Matriz homogênea marcada 1D, tamanho imutável.
Frames de dados 2 Estrutura tabular rotulada em 2D geral, com tamanho mutável com colunas potencialmente heterogeneamente tipadas.
Painel 3 Matriz rotulada em 3D geral, com tamanho mutável.

Construir e lidar com dois ou mais arrays dimensionais é uma tarefa tediosa, pois o usuário tem que considerar a orientação do conjunto de dados ao escrever funções. Mas usando as estruturas de dados do Pandas, o esforço mental do usuário é reduzido.

Por exemplo, com dados tabulares (DataFrame), é semanticamente mais útil pensar no index (as linhas) e o columns em vez do eixo 0 e eixo 1.

Mutabilidade

Todas as estruturas de dados do Pandas são mutáveis ​​por valor (podem ser alteradas) e, exceto Series, todas são mutáveis ​​por tamanho. A série tem tamanho imutável.

Note- DataFrame é amplamente utilizado e uma das estruturas de dados mais importantes. O painel é usado muito menos.

Series

A série é uma estrutura semelhante a uma matriz unidimensional com dados homogêneos. Por exemplo, a série a seguir é uma coleção de inteiros 10, 23, 56, ...

10 23 56 17 52 61 73 90 26 72

Pontos chave

  • Dados homogêneos
  • Tamanho imutável
  • Valores de dados mutáveis

Quadro de dados

DataFrame é uma matriz bidimensional com dados heterogêneos. Por exemplo,

Nome Era Gênero Avaliação
Steve 32 Masculino 3,45
Lia 28 Fêmea 4,6
Vin 45 Masculino 3,9
Katie 38 Fêmea 2,78

A tabela representa os dados de uma equipe de vendas de uma organização com sua classificação geral de desempenho. Os dados são representados em linhas e colunas. Cada coluna representa um atributo e cada linha representa uma pessoa.

Tipo de dados das colunas

Os tipos de dados das quatro colunas são os seguintes -

Coluna Tipo
Nome Corda
Era Inteiro
Gênero Corda
Avaliação Flutuador

Pontos chave

  • Dados heterogêneos
  • Tamanho mutável
  • Dados mutáveis

Painel

Painel é uma estrutura de dados tridimensional com dados heterogêneos. É difícil representar o painel em representação gráfica. Mas um painel pode ser ilustrado como um contêiner de DataFrame.

Pontos chave

  • Dados heterogêneos
  • Tamanho mutável
  • Dados mutáveis

Series é um array rotulado unidimensional capaz de conter dados de qualquer tipo (inteiro, string, float, objetos python, etc.). Os rótulos dos eixos são chamados coletivamente de índice.

pandas.Series

Uma série pandas pode ser criada usando o seguinte construtor -

pandas.Series( data, index, dtype, copy)

Os parâmetros do construtor são os seguintes -

Sr. Não Parâmetro e Descrição
1

data

os dados assumem várias formas, como ndarray, lista, constantes

2

index

Os valores do índice devem ser únicos e hashable, mesmo comprimento que os dados. Padrãonp.arange(n) se nenhum índice for passado.

3

dtype

dtype é para tipo de dados. Se nenhum, o tipo de dados será inferido

4

copy

Copie os dados. Falso padrão

Uma série pode ser criada usando várias entradas como -

  • Array
  • Dict
  • Valor escalar ou constante

Crie uma série vazia

Uma série básica que pode ser criada é uma série vazia.

Exemplo

#import the pandas library and aliasing as pd
import pandas as pd
s = pd.Series()
print s

Está output é o seguinte -

Series([], dtype: float64)

Crie uma série de ndarray

Se os dados forem um ndarray, o índice transmitido deve ter o mesmo comprimento. Se nenhum índice for passado, então, por padrão, o índice serárange(n) Onde n é o comprimento da matriz, ou seja, [0,1,2,3…. range(len(array))-1].

Exemplo 1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print s

Está output é o seguinte -

0   a
1   b
2   c
3   d
dtype: object

Não passamos nenhum índice, então, por padrão, ele atribuiu os índices que variam de 0 a len(data)-1, ou seja, 0 a 3.

Exemplo 2

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s

Está output é o seguinte -

100  a
101  b
102  c
103  d
dtype: object

Passamos os valores do índice aqui. Agora podemos ver os valores indexados personalizados na saída.

Crie uma série de dict

UMA dictpode ser passado como entrada e, se nenhum índice for especificado, as chaves do dicionário são obtidas em uma ordem de classificação para construir o índice. E seindex for passado, os valores nos dados correspondentes aos rótulos no índice serão retirados.

Exemplo 1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print s

Está output é o seguinte -

a 0.0
b 1.0
c 2.0
dtype: float64

Observe - As chaves de dicionário são usadas para construir o índice.

Exemplo 2

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s

Está output é o seguinte -

b 1.0
c 2.0
d NaN
a 0.0
dtype: float64

Observe - A ordem do índice é persistida e o elemento ausente é preenchido com NaN (não é um número).

Crie uma série de escalar

Se os dados forem um valor escalar, um índice deve ser fornecido. O valor será repetido para corresponder ao comprimento deindex

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s

Está output é o seguinte -

0  5
1  5
2  5
3  5
dtype: int64

Acessando Dados de Série com Posição

Os dados da série podem ser acessados ​​de forma semelhante a uma ndarray.

Exemplo 1

Recupere o primeiro elemento. Como já sabemos, a contagem começa do zero para a matriz, o que significa que o primeiro elemento é armazenado em zero ª posição e assim por diante.

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the first element
print s[0]

Está output é o seguinte -

1

Exemplo 2

Recupere os três primeiros elementos da Série. Se: for inserido na frente dele, todos os itens desse índice em diante serão extraídos. Se dois parâmetros (com: entre eles) forem usados, os itens entre os dois índices (sem incluir o índice de parada)

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the first three element
print s[:3]

Está output é o seguinte -

a  1
b  2
c  3
dtype: int64

Exemplo 3

Recupere os últimos três elementos.

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve the last three element
print s[-3:]

Está output é o seguinte -

c  3
d  4
e  5
dtype: int64

Recuperar dados usando rótulo (índice)

Série A é como um tamanho fixo dict em que você pode obter e definir valores por rótulo de índice.

Exemplo 1

Recupere um único elemento usando o valor do rótulo do índice.

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve a single element
print s['a']

Está output é o seguinte -

1

Exemplo 2

Recupere vários elementos usando uma lista de valores de rótulo de índice.

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve multiple elements
print s[['a','c','d']]

Está output é o seguinte -

a  1
c  3
d  4
dtype: int64

Exemplo 3

Se um rótulo não estiver contido, uma exceção será gerada.

import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])

#retrieve multiple elements
print s['f']

Está output é o seguinte -

…
KeyError: 'f'

Um quadro de dados é uma estrutura de dados bidimensional, ou seja, os dados são alinhados de forma tabular em linhas e colunas.

Recursos do DataFrame

  • Potencialmente, as colunas são de tipos diferentes
  • Tamanho - Mutável
  • Eixos rotulados (linhas e colunas)
  • Pode realizar operações aritméticas em linhas e colunas

Estrutura

Vamos supor que estamos criando um quadro de dados com os dados do aluno.

Você pode pensar nisso como uma tabela SQL ou uma representação de dados de planilha.

pandas.DataFrame

Um DataFrame pandas pode ser criado usando o seguinte construtor -

pandas.DataFrame( data, index, columns, dtype, copy)

Os parâmetros do construtor são os seguintes -

Sr. Não Parâmetro e Descrição
1

data

os dados assumem várias formas como ndarray, série, mapa, listas, dict, constantes e também outro DataFrame.

2

index

Para os rótulos de linha, o Índice a ser usado para o quadro resultante é Padrão Opcional np.arange (n) se nenhum índice for passado.

3

columns

Para rótulos de coluna, a sintaxe padrão opcional é - np.arange (n). Isso só é verdade se nenhum índice for passado.

4

dtype

Tipo de dados de cada coluna.

5

copy

Este comando (ou seja lá o que for) é usado para copiar dados, se o padrão for False.

Criar DataFrame

Um DataFrame do pandas pode ser criado usando várias entradas como -

  • Lists
  • dict
  • Series
  • Numpy ndarrays
  • Outro DataFrame

Nas seções subsequentes deste capítulo, veremos como criar um DataFrame usando essas entradas.

Crie um DataFrame vazio

Um DataFrame básico, que pode ser criado, é um Dataframe Vazio.

Exemplo

#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df

Está output é o seguinte -

Empty DataFrame
Columns: []
Index: []

Crie um DataFrame a partir de listas

O DataFrame pode ser criado usando uma única lista ou uma lista de listas.

Exemplo 1

import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df

Está output é o seguinte -

0
0    1
1    2
2    3
3    4
4    5

Exemplo 2

import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df

Está output é o seguinte -

Name      Age
0     Alex      10
1     Bob       12
2     Clarke    13

Exemplo 3

import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df

Está output é o seguinte -

Name     Age
0     Alex     10.0
1     Bob      12.0
2     Clarke   13.0

Note - Observe, o dtype parâmetro muda o tipo de coluna Age para ponto flutuante.

Crie um DataFrame a partir de Dict of ndarrays / Lists

Todos ndarraysdeve ter o mesmo comprimento. Se o índice for passado, o comprimento do índice deve ser igual ao comprimento das matrizes.

Se nenhum índice for passado, então, por padrão, o índice será o intervalo (n), onde n é o comprimento da matriz.

Exemplo 1

import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df

Está output é o seguinte -

Age      Name
0     28        Tom
1     34       Jack
2     29      Steve
3     42      Ricky

Note- Observe os valores 0,1,2,3. Eles são o índice padrão atribuído a cada um usando o intervalo de funções (n).

Exemplo 2

Vamos agora criar um DataFrame indexado usando arrays.

import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df

Está output é o seguinte -

Age    Name
rank1    28      Tom
rank2    34     Jack
rank3    29    Steve
rank4    42    Ricky

Note - Observe, o index parâmetro atribui um índice para cada linha.

Crie um DataFrame a partir da Lista de Dictos

A lista de dicionários pode ser passada como dados de entrada para criar um DataFrame. As chaves do dicionário são, por padrão, consideradas nomes de coluna.

Exemplo 1

O exemplo a seguir mostra como criar um DataFrame passando uma lista de dicionários.

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df

Está output é o seguinte -

a    b      c
0   1   2     NaN
1   5   10   20.0

Note - Observe, NaN (não é um número) é acrescentado nas áreas ausentes.

Exemplo 2

O exemplo a seguir mostra como criar um DataFrame passando uma lista de dicionários e os índices de linha.

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df

Está output é o seguinte -

a   b       c
first   1   2     NaN
second  5   10   20.0

Exemplo 3

O exemplo a seguir mostra como criar um DataFrame com uma lista de dicionários, índices de linha e índices de coluna.

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]

#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])

#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2

Está output é o seguinte -

#df1 output
         a  b
first    1  2
second   5  10

#df2 output
         a  b1
first    1  NaN
second   5  NaN

Note- Observe, df2 DataFrame é criado com um índice de coluna diferente da chave de dicionário; assim, anexou o NaN no lugar. Enquanto df1 é criado com índices de coluna iguais às chaves de dicionário, então NaN é anexado.

Crie um DataFrame a partir do Dict of Series

O Dicionário de Séries pode ser passado para formar um DataFrame. O índice resultante é a união de todos os índices de série passados.

Exemplo

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df

Está output é o seguinte -

one    two
a     1.0    1
b     2.0    2
c     3.0    3
d     NaN    4

Note - Observe, para a série um, não há rótulo ‘d’ passou, mas no resultado, para o d rótulo, NaN é anexado com NaN.

Vamos entender agora column selection, addition, e deletion por meio de exemplos.

Seleção de coluna

Vamos entender isso selecionando uma coluna do DataFrame.

Exemplo

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df ['one']

Está output é o seguinte -

a     1.0
b     2.0
c     3.0
d     NaN
Name: one, dtype: float64

Adição de coluna

Vamos entender isso adicionando uma nova coluna a um quadro de dados existente.

Exemplo

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)

# Adding a new column to an existing DataFrame object with column label by passing new series

print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df

print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']

print df

Está output é o seguinte -

Adding a new column by passing as Series:
     one   two   three
a    1.0    1    10.0
b    2.0    2    20.0
c    3.0    3    30.0
d    NaN    4    NaN

Adding a new column using the existing columns in DataFrame:
      one   two   three    four
a     1.0    1    10.0     11.0
b     2.0    2    20.0     22.0
c     3.0    3    30.0     33.0
d     NaN    4     NaN     NaN

Exclusão de coluna

As colunas podem ser excluídas ou removidas; vamos dar um exemplo para entender como.

Exemplo

# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']), 
   'three' : pd.Series([10,20,30], index=['a','b','c'])}

df = pd.DataFrame(d)
print ("Our dataframe is:")
print df

# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df

# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df

Está output é o seguinte -

Our dataframe is:
      one   three  two
a     1.0    10.0   1
b     2.0    20.0   2
c     3.0    30.0   3
d     NaN     NaN   4

Deleting the first column using DEL function:
      three    two
a     10.0     1
b     20.0     2
c     30.0     3
d     NaN      4

Deleting another column using POP function:
   three
a  10.0
b  20.0
c  30.0
d  NaN

Seleção, adição e exclusão de linhas

Agora entenderemos a seleção, adição e exclusão de linhas por meio de exemplos. Comecemos com o conceito de seleção.

Seleção por Rótulo

As linhas podem ser selecionadas passando o rótulo da linha para um loc função.

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df.loc['b']

Está output é o seguinte -

one 2.0
two 2.0
Name: b, dtype: float64

O resultado é uma série com rótulos como nomes de colunas do DataFrame. E o Nome da série é o rótulo com o qual é recuperado.

Seleção por localização inteira

As linhas podem ser selecionadas passando a localização do inteiro para um iloc função.

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df.iloc[2]

Está output é o seguinte -

one   3.0
two   3.0
Name: c, dtype: float64

Fatiar linhas

Várias linhas podem ser selecionadas usando o operador ':'.

import pandas as pd

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)
print df[2:4]

Está output é o seguinte -

one  two
c  3.0    3
d  NaN    4

Adição de linhas

Adicione novas linhas a um DataFrame usando o appendfunção. Esta função irá anexar as linhas no final.

import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])

df = df.append(df2)
print df

Está output é o seguinte -

a  b
0  1  2
1  3  4
0  5  6
1  7  8

Exclusão de linhas

Use o rótulo de índice para excluir ou descartar linhas de um DataFrame. Se o rótulo estiver duplicado, várias linhas serão eliminadas.

Se você observar, no exemplo acima, os rótulos estão duplicados. Vamos eliminar um rótulo e ver quantas linhas serão eliminadas.

import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])

df = df.append(df2)

# Drop rows with label 0
df = df.drop(0)

print df

Está output é o seguinte -

a b
1 3 4
1 7 8

No exemplo acima, duas linhas foram eliminadas porque essas duas contêm o mesmo rótulo 0.

UMA panelé um contêiner 3D de dados. O termoPanel data é derivado da econometria e é parcialmente responsável pelo nome pandas - pan(el)-da(ta)-s.

Os nomes dos 3 eixos têm como objetivo dar algum significado semântico à descrição de operações envolvendo dados de painel. Eles são -

  • items - eixo 0, cada item corresponde a um DataFrame contido nele.

  • major_axis - eixo 1, é o índice (linhas) de cada um dos DataFrames.

  • minor_axis - eixo 2, são as colunas de cada um dos DataFrames.

pandas.Panel ()

Um painel pode ser criado usando o seguinte construtor -

pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)

Os parâmetros do construtor são os seguintes -

Parâmetro Descrição
dados Os dados assumem várias formas, como ndarray, série, mapa, listas, dict, constantes e também outro DataFrame
Itens eixo = 0
eixo principal eixo = 1
eixo menor eixo = 2
tipo d Tipo de dados de cada coluna
cópia de Copie os dados. Padrão,false

Criar Painel

Um painel pode ser criado de várias maneiras, como -

  • De ndarrays
  • Do dicionário de DataFrames

De 3D ndarray

# creating an empty panel
import pandas as pd
import numpy as np

data = np.random.rand(2,4,5)
p = pd.Panel(data)
print p

Está output é o seguinte -

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 5 (minor_axis)
Items axis: 0 to 1
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 4

Note - Observe as dimensões do painel vazio e do painel acima, todos os objetos são diferentes.

De dict de DataFrame Objects

#creating an empty panel
import pandas as pd
import numpy as np

data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), 
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p

Está output é o seguinte -

Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2

Crie um painel vazio

Um painel vazio pode ser criado usando o construtor de painel da seguinte forma -

#creating an empty panel
import pandas as pd
p = pd.Panel()
print p

Está output é o seguinte -

<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None

Selecionando os dados do painel

Selecione os dados do painel usando -

  • Items
  • Major_axis
  • Minor_axis

Usando itens

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), 
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p['Item1']

Está output é o seguinte -

0          1          2
0    0.488224  -0.128637   0.930817
1    0.417497   0.896681   0.576657
2   -2.775266   0.571668   0.290082
3   -0.400538  -0.144234   1.110535

Temos dois itens e recuperamos o item1. O resultado é um DataFrame com 4 linhas e 3 colunas, que são oMajor_axis e Minor_axis dimensões.

Usando major_axis

Os dados podem ser acessados ​​usando o método panel.major_axis(index).

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), 
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.major_xs(1)

Está output é o seguinte -

Item1       Item2
0   0.417497    0.748412
1   0.896681   -0.557322
2   0.576657       NaN

Usando menor_axis

Os dados podem ser acessados ​​usando o método panel.minor_axis(index).

# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), 
   'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.minor_xs(1)

Está output é o seguinte -

Item1       Item2
0   -0.128637   -1.047032
1    0.896681   -0.557322
2    0.571668    0.431953
3   -0.144234    1.302466

Note - Observe as mudanças nas dimensões.

Até agora, aprendemos sobre as três estruturas de dados do Pandas e como criá-las. Vamos nos concentrar principalmente nos objetos DataFrame devido à sua importância no processamento de dados em tempo real e também discutir algumas outras DataStructures.

Funcionalidade básica da série

Sr. Não. Atributo ou método e descrição
1

axes

Retorna uma lista dos rótulos dos eixos das linhas

2

dtype

Retorna o dtype do objeto.

3

empty

Retorna True se a série estiver vazia.

4

ndim

Retorna o número de dimensões dos dados subjacentes, por definição 1.

5

size

Retorna o número de elementos nos dados subjacentes.

6

values

Retorna a série como ndarray.

7

head()

Retorna as primeiras n linhas.

8

tail()

Retorna as últimas n linhas.

Vamos agora criar uma série e ver a operação de todos os atributos tabulados acima.

Exemplo

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print s

Está output é o seguinte -

0   0.967853
1  -0.148368
2  -1.395906
3  -1.758394
dtype: float64

eixos

Retorna a lista de rótulos da série.

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("The axes are:")
print s.axes

Está output é o seguinte -

The axes are:
[RangeIndex(start=0, stop=4, step=1)]

O resultado acima é um formato compacto de uma lista de valores de 0 a 5, ou seja, [0,1,2,3,4].

vazio

Retorna o valor booleano informando se o objeto está vazio ou não. True indica que o objeto está vazio.

import pandas as pd
import numpy as np

#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("Is the Object empty?")
print s.empty

Está output é o seguinte -

Is the Object empty?
False

ndim

Retorna o número de dimensões do objeto. Por definição, uma série é uma estrutura de dados 1D, então ela retorna

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s

print ("The dimensions of the object:")
print s.ndim

Está output é o seguinte -

0   0.175898
1   0.166197
2  -0.609712
3  -1.377000
dtype: float64

The dimensions of the object:
1

Tamanho

Retorna o tamanho (comprimento) da série.

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(2))
print s
print ("The size of the object:")
print s.size

Está output é o seguinte -

0   3.078058
1  -1.207803
dtype: float64

The size of the object:
2

valores

Retorna os dados reais da série como uma matriz.

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s

print ("The actual data series is:")
print s.values

Está output é o seguinte -

0   1.787373
1  -0.605159
2   0.180477
3  -0.140922
dtype: float64

The actual data series is:
[ 1.78737302 -0.60515881 0.18047664 -0.1409218 ]

Cabeça e cauda

Para visualizar uma pequena amostra de um objeto Series ou DataFrame, use os métodos head () e tail ().

head() retorna o primeiro nlinhas (observe os valores do índice). O número padrão de elementos a serem exibidos é cinco, mas você pode passar um número personalizado.

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s

print ("The first two rows of the data series:")
print s.head(2)

Está output é o seguinte -

The original series is:
0   0.720876
1  -0.765898
2   0.479221
3  -0.139547
dtype: float64

The first two rows of the data series:
0   0.720876
1  -0.765898
dtype: float64

tail() retorna o último nlinhas (observe os valores do índice). O número padrão de elementos a serem exibidos é cinco, mas você pode passar um número personalizado.

import pandas as pd
import numpy as np

#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s

print ("The last two rows of the data series:")
print s.tail(2)

Está output é o seguinte -

The original series is:
0 -0.655091
1 -0.881407
2 -0.608592
3 -2.341413
dtype: float64

The last two rows of the data series:
2 -0.608592
3 -2.341413
dtype: float64

Funcionalidade básica do DataFrame

Vamos agora entender o que é DataFrame Basic Functionality. As tabelas a seguir listam os atributos ou métodos importantes que ajudam na funcionalidade básica do DataFrame.

Sr. Não. Atributo ou método e descrição
1

T

Transpõe linhas e colunas.

2

axes

Retorna uma lista com os rótulos do eixo da linha e rótulos do eixo da coluna como os únicos membros.

3

dtypes

Retorna os dtypes neste objeto.

4

empty

Verdadeiro se NDFrame estiver totalmente vazio [sem itens]; se algum dos eixos tiver comprimento 0.

5

ndim

Número de eixos / dimensões da matriz.

6

shape

Retorna uma tupla que representa a dimensionalidade do DataFrame.

7

size

Número de elementos no NDFrame.

8

values

Representação numpy de NDFrame.

9

head()

Retorna as primeiras n linhas.

10

tail()

Retorna as últimas n linhas.

Vamos agora criar um DataFrame e ver como funcionam os atributos mencionados acima.

Exemplo

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print df

Está output é o seguinte -

Our data series is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

T (transpor)

Retorna a transposição do DataFrame. As linhas e colunas serão trocadas.

import pandas as pd
import numpy as np
 
# Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

# Create a DataFrame
df = pd.DataFrame(d)
print ("The transpose of the data series is:")
print df.T

Está output é o seguinte -

The transpose of the data series is:
         0     1       2      3      4      5       6
Age      25    26      25     23     30     29      23
Name     Tom   James   Ricky  Vin    Steve  Smith   Jack
Rating   4.23  3.24    3.98   2.56   3.2    4.6     3.8

eixos

Retorna a lista de rótulos de eixo de linha e rótulos de eixo de coluna.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Row axis labels and column axis labels are:")
print df.axes

Está output é o seguinte -

Row axis labels and column axis labels are:

[RangeIndex(start=0, stop=7, step=1), Index([u'Age', u'Name', u'Rating'],
dtype='object')]

dtypes

Retorna o tipo de dados de cada coluna.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("The data types of each column are:")
print df.dtypes

Está output é o seguinte -

The data types of each column are:
Age     int64
Name    object
Rating  float64
dtype: object

vazio

Retorna o valor booleano informando se o objeto está vazio ou não; True indica que o objeto está vazio.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
 
#Create a DataFrame
df = pd.DataFrame(d)
print ("Is the object empty?")
print df.empty

Está output é o seguinte -

Is the object empty?
False

ndim

Retorna o número de dimensões do objeto. Por definição, DataFrame é um objeto 2D.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The dimension of the object is:")
print df.ndim

Está output é o seguinte -

Our object is:
      Age    Name     Rating
0     25     Tom      4.23
1     26     James    3.24
2     25     Ricky    3.98
3     23     Vin      2.56
4     30     Steve    3.20
5     29     Smith    4.60
6     23     Jack     3.80

The dimension of the object is:
2

forma

Retorna uma tupla que representa a dimensionalidade do DataFrame. Tupla (a, b), onde a representa o número de linhas eb representa o número de colunas.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
 
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The shape of the object is:")
print df.shape

Está output é o seguinte -

Our object is:
   Age   Name    Rating
0  25    Tom     4.23
1  26    James   3.24
2  25    Ricky   3.98
3  23    Vin     2.56
4  30    Steve   3.20
5  29    Smith   4.60
6  23    Jack    3.80

The shape of the object is:
(7, 3)

Tamanho

Retorna o número de elementos no DataFrame.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
 
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The total number of elements in our object is:")
print df.size

Está output é o seguinte -

Our object is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The total number of elements in our object is:
21

valores

Retorna os dados reais no DataFrame como um NDarray.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
 
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The actual data in our data frame is:")
print df.values

Está output é o seguinte -

Our object is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80
The actual data in our data frame is:
[[25 'Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Smith' 4.6]
[23 'Jack' 3.8]]

Cabeça e cauda

Para visualizar uma pequena amostra de um objeto DataFrame, use o head() e os métodos tail (). head() retorna o primeiro nlinhas (observe os valores do índice). O número padrão de elementos a serem exibidos é cinco, mas você pode passar um número personalizado.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The first two rows of the data frame is:")
print df.head(2)

Está output é o seguinte -

Our data frame is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The first two rows of the data frame is:
   Age   Name   Rating
0  25    Tom    4.23
1  26    James  3.24

tail() retorna o último nlinhas (observe os valores do índice). O número padrão de elementos a serem exibidos é cinco, mas você pode passar um número personalizado.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
   'Age':pd.Series([25,26,25,23,30,29,23]), 
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
 
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The last two rows of the data frame is:")
print df.tail(2)

Está output é o seguinte -

Our data frame is:
    Age   Name    Rating
0   25    Tom     4.23
1   26    James   3.24
2   25    Ricky   3.98
3   23    Vin     2.56
4   30    Steve   3.20
5   29    Smith   4.60
6   23    Jack    3.80

The last two rows of the data frame is:
    Age   Name    Rating
5   29    Smith    4.6
6   23    Jack     3.8

Um grande número de métodos calcula coletivamente estatísticas descritivas e outras operações relacionadas no DataFrame. A maioria dessas são agregações comosum(), mean(), mas alguns deles, como sumsum(), produz um objeto do mesmo tamanho. De um modo geral, esses métodos levam umaxisargumento, assim como ndarray. {sum, std, ...}, mas o eixo pode ser especificado por nome ou inteiro

  • DataFrame - “índice” (eixo = 0, padrão), “colunas” (eixo = 1)

Vamos criar um DataFrame e usar esse objeto ao longo deste capítulo para todas as operações.

Exemplo

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df

Está output é o seguinte -

Age  Name   Rating
0   25   Tom     4.23
1   26   James   3.24
2   25   Ricky   3.98
3   23   Vin     2.56
4   30   Steve   3.20
5   29   Smith   4.60
6   23   Jack    3.80
7   34   Lee     3.78
8   40   David   2.98
9   30   Gasper  4.80
10  51   Betina  4.10
11  46   Andres  3.65

soma()

Retorna a soma dos valores do eixo solicitado. Por padrão, o eixo é índice (eixo = 0).

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.sum()

Está output é o seguinte -

Age                                                    382
Name     TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Rating                                               44.92
dtype: object

Cada coluna individual é adicionada individualmente (Strings são anexadas).

eixo = 1

Esta sintaxe fornecerá a saída conforme mostrado abaixo.

import pandas as pd
import numpy as np
 
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
 
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum(1)

Está output é o seguinte -

0    29.23
1    29.24
2    28.98
3    25.56
4    33.20
5    33.60
6    26.80
7    37.78
8    42.98
9    34.80
10   55.10
11   49.65
dtype: float64

significar()

Retorna o valor médio

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.mean()

Está output é o seguinte -

Age       31.833333
Rating     3.743333
dtype: float64

std ()

Retorna o desvio padrão de Bressel das colunas numéricas.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.std()

Está output é o seguinte -

Age       9.232682
Rating    0.661628
dtype: float64

Funções e descrição

Vamos agora entender as funções em Estatística Descritiva em Python Pandas. A tabela a seguir lista as funções importantes -

Sr. Não. Função Descrição
1 contagem() Número de observações não nulas
2 soma() Soma de valores
3 significar() Média dos Valores
4 mediana() Mediana de Valores
5 modo() Modo de valores
6 std () Desvio Padrão dos Valores
7 min () Valor mínimo
8 max () Valor máximo
9 abdômen() Valor absoluto
10 prod () Produto de Valores
11 cumsum () Soma Cumulativa
12 cumprod () Produto Cumulativo

Note- Uma vez que DataFrame é uma estrutura de dados heterogênea. As operações genéricas não funcionam com todas as funções.

  • Funções como sum(), cumsum()trabalhar com elementos de dados numéricos e de caracteres (ou) de string sem nenhum erro. Apesarn prática, agregações de caracteres nunca são usadas geralmente, essas funções não lançam nenhuma exceção.

  • Funções como abs(), cumprod() lançar exceção quando o DataFrame contém dados de caractere ou string porque tais operações não podem ser executadas.

Resumindo Dados

o describe() função calcula um resumo das estatísticas pertencentes às colunas DataFrame.

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.describe()

Está output é o seguinte -

Age         Rating
count    12.000000      12.000000
mean     31.833333       3.743333
std       9.232682       0.661628
min      23.000000       2.560000
25%      25.000000       3.230000
50%      29.500000       3.790000
75%      35.500000       4.132500
max      51.000000       4.800000

Esta função dá o mean, std e IQRvalores. E a função exclui as colunas de caracteres e o resumo fornecido sobre as colunas numéricas.'include'é o argumento usado para passar informações necessárias sobre quais colunas precisam ser consideradas para o resumo. Pega a lista de valores; por padrão, 'número'.

  • object - Resume colunas String
  • number - Resume as colunas numéricas
  • all - Resume todas as colunas juntas (não deve ser passado como um valor de lista)

Agora, use a seguinte instrução no programa e verifique a saída -

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df.describe(include=['object'])

Está output é o seguinte -

Name
count       12
unique      12
top      Ricky
freq         1

Agora, use a seguinte instrução e verifique a saída -

import pandas as pd
import numpy as np

#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
   'Lee','David','Gasper','Betina','Andres']),
   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}

#Create a DataFrame
df = pd.DataFrame(d)
print df. describe(include='all')

Está output é o seguinte -

Age          Name       Rating
count   12.000000        12    12.000000
unique        NaN        12          NaN
top           NaN     Ricky          NaN
freq          NaN         1          NaN
mean    31.833333       NaN     3.743333
std      9.232682       NaN     0.661628
min     23.000000       NaN     2.560000
25%     25.000000       NaN     3.230000
50%     29.500000       NaN     3.790000
75%     35.500000       NaN     4.132500
max     51.000000       NaN     4.800000

Para aplicar as suas próprias funções ou as funções de outra biblioteca aos objetos Pandas, você deve estar ciente dos três métodos importantes. Os métodos foram discutidos abaixo. O método apropriado a ser usado depende se sua função espera operar em um DataFrame inteiro, linha ou coluna, ou elemento.

  • Aplicação da função table wise: pipe ()
  • Aplicação de função inteligente de linha ou coluna: apply ()
  • Aplicação de função elementar: applymap ()

Aplicação de função table-wise

As operações personalizadas podem ser realizadas passando a função e o número apropriado de parâmetros como argumentos de canal. Assim, a operação é realizada em todo o DataFrame.

Por exemplo, adicione um valor 2 a todos os elementos no DataFrame. Então,

função adicionador

A função somadora adiciona dois valores numéricos como parâmetros e retorna a soma.

def adder(ele1,ele2):
   return ele1+ele2

Agora usaremos a função personalizada para conduzir a operação no DataFrame.

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)

Vamos ver o programa completo -

import pandas as pd
import numpy as np

def adder(ele1,ele2):
   return ele1+ele2

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
print df.apply(np.mean)

Está output é o seguinte -

col1       col2       col3
0   2.176704   2.219691   1.509360
1   2.222378   2.422167   3.953921
2   2.241096   1.135424   2.696432
3   2.355763   0.376672   1.182570
4   2.308743   2.714767   2.130288

Aplicação de função inteligente de linha ou coluna

Funções arbitrárias podem ser aplicadas ao longo dos eixos de um DataFrame ou Painel usando o apply()método, que, como os métodos de estatística descritiva, leva um argumento de eixo opcional. Por padrão, a operação é executada em colunas, tomando cada coluna como um array.

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
print df.apply(np.mean)

Está output é o seguinte -

col1   -0.288022
col2    1.044839
col3   -0.187009
dtype: float64

Passando axis parâmetro, as operações podem ser realizadas em linha.

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean,axis=1)
print df.apply(np.mean)

Está output é o seguinte -

col1    0.034093
col2   -0.152672
col3   -0.229728
dtype: float64

Exemplo 3

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(lambda x: x.max() - x.min())
print df.apply(np.mean)

Está output é o seguinte -

col1   -0.167413
col2   -0.370495
col3   -0.707631
dtype: float64

Aplicativo de função do elemento sábio

Nem todas as funções podem ser vetorizadas (nem as matrizes NumPy que retornam outra matriz nem qualquer valor), os métodos applymap() no DataFrame e analogously map() em Series aceita qualquer função Python recebendo um único valor e retornando um único valor.

Exemplo 1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])

# My custom function
df['col1'].map(lambda x:x*100)
print df.apply(np.mean)

Está output é o seguinte -

col1    0.480742
col2    0.454185
col3    0.266563
dtype: float64

Exemplo 2

import pandas as pd
import numpy as np

# My custom function
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.applymap(lambda x:x*100)
print df.apply(np.mean)

Está output é o seguinte -

col1    0.395263
col2    0.204418
col3   -0.795188
dtype: float64

Reindexingaltera os rótulos de linha e de coluna de um DataFrame. Para reindexar meios para se conformar os dados para coincidir com um determinado conjunto de etiquetas ao longo de um eixo particular.

Várias operações podem ser realizadas por meio de indexação como -

  • Reordene os dados existentes para corresponder a um novo conjunto de rótulos.

  • Insira marcadores de valor ausente (NA) em locais de etiqueta onde não existiam dados para a etiqueta.

Exemplo

import pandas as pd
import numpy as np

N=20

df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
})

#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])

print df_reindexed

Está output é o seguinte -

A    C     B
0  2016-01-01  Low   NaN
2  2016-01-03  High  NaN
5  2016-01-06  Low   NaN

Reindexar para alinhar com outros objetos

Você pode querer pegar um objeto e reindexar seus eixos para serem rotulados da mesma forma que outro objeto. Considere o seguinte exemplo para entender o mesmo.

Exemplo

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])

df1 = df1.reindex_like(df2)
print df1

Está output é o seguinte -

col1         col2         col3
0    -2.467652    -1.211687    -0.391761
1    -0.287396     0.522350     0.562512
2    -0.255409    -0.483250     1.866258
3    -1.150467    -0.646493    -0.222462
4     0.152768    -2.056643     1.877233
5    -1.155997     1.528719    -1.343719
6    -1.015606    -1.245936    -0.295275

Note - Aqui, o df1 DataFrame é alterado e reindexado como df2. Os nomes das colunas devem ser correspondidos ou então NAN será adicionado para todo o rótulo da coluna.

Preencher enquanto ReIndexar

reindex() usa um método de parâmetro opcional que é um método de preenchimento com os valores a seguir -

  • pad/ffill - Preencher valores adiante

  • bfill/backfill - Preencher valores para trás

  • nearest - Preencher com os valores de índice mais próximos

Exemplo

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')

Está output é o seguinte -

col1        col2       col3
0    1.311620   -0.707176   0.599863
1   -0.423455   -0.700265   1.133371
2         NaN         NaN        NaN
3         NaN         NaN        NaN
4         NaN         NaN        NaN
5         NaN         NaN        NaN

Data Frame with Forward Fill:
         col1        col2        col3
0    1.311620   -0.707176    0.599863
1   -0.423455   -0.700265    1.133371
2   -0.423455   -0.700265    1.133371
3   -0.423455   -0.700265    1.133371
4   -0.423455   -0.700265    1.133371
5   -0.423455   -0.700265    1.133371

Note - As últimas quatro linhas são preenchidas.

Limites de enchimento durante reindexação

O argumento limite fornece controle adicional sobre o preenchimento durante a reindexação. Limite especifica a contagem máxima de correspondências consecutivas. Vamos considerar o seguinte exemplo para entender o mesmo -

Exemplo

import pandas as pd
import numpy as np
 
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)

Está output é o seguinte -

col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2         NaN         NaN         NaN
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

Data Frame with Forward Fill limiting to 1:
         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2   -0.055713   -0.021732   -0.174577
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

Note- Observe, apenas a 7ª linha é preenchida pela 6ª linha anterior. Então, as linhas são deixadas como estão.

Renomeando

O método rename () permite que você renomeie um eixo com base em algum mapeamento (um dicionário ou série) ou uma função arbitrária.

Vamos considerar o seguinte exemplo para entender isso -

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1

print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})

Está output é o seguinte -

col1        col2        col3
0    0.486791    0.105759    1.540122
1   -0.990237    1.007885   -0.217896
2   -0.483855   -1.645027   -1.194113
3   -0.122316    0.566277   -0.366028
4   -0.231524   -0.721172   -0.112007
5    0.438810    0.000225    0.435479

After renaming the rows and columns:
                c1          c2        col3
apple     0.486791    0.105759    1.540122
banana   -0.990237    1.007885   -0.217896
durian   -0.483855   -1.645027   -1.194113
3        -0.122316    0.566277   -0.366028
4        -0.231524   -0.721172   -0.112007
5         0.438810    0.000225    0.435479

O método rename () fornece um inplaceparâmetro nomeado, que por padrão é False e copia os dados subjacentes. Passarinplace=True para renomear os dados no local.

O comportamento da iteração básica sobre os objetos Pandas depende do tipo. Ao iterar em uma série, ela é considerada semelhante a uma matriz e a iteração básica produz os valores. Outras estruturas de dados, como DataFrame e Panel, seguem odict-like convenção de iteração sobre o keys dos objetos.

Em suma, iteração básica (para i no objeto) produz -

  • Series - valores

  • DataFrame - rótulos de coluna

  • Panel - rótulos de itens

Iterando um DataFrame

A iteração de um DataFrame fornece nomes de coluna. Vamos considerar o seguinte exemplo para entender o mesmo.

import pandas as pd
import numpy as np
 
N=20
df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
   })

for col in df:
   print col

Está output é o seguinte -

A
C
D
x
y

Para iterar nas linhas do DataFrame, podemos usar as seguintes funções -

  • iteritems() - para iterar nos pares (chave, valor)

  • iterrows() - itera sobre as linhas como pares (índice, série)

  • itertuples() - itera sobre as linhas como duplas nomeadas

iteritems ()

Itera em cada coluna como chave, par de valores com rótulo como chave e valor da coluna como um objeto Series.

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
   print key,value

Está output é o seguinte -

col1 0    0.802390
1    0.324060
2    0.256811
3    0.839186
Name: col1, dtype: float64

col2 0    1.624313
1   -1.033582
2    1.796663
3    1.856277
Name: col2, dtype: float64

col3 0   -0.022142
1   -0.230820
2    1.160691
3   -0.830279
Name: col3, dtype: float64

Observe que cada coluna é iterada separadamente como um par de valores-chave em uma série.

iterrows ()

iterrows () retorna o iterador produzindo cada valor de índice junto com uma série contendo os dados em cada linha.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
   print row_index,row

Está output é o seguinte -

0  col1    1.529759
   col2    0.762811
   col3   -0.634691
Name: 0, dtype: float64

1  col1   -0.944087
   col2    1.420919
   col3   -0.507895
Name: 1, dtype: float64
 
2  col1   -0.077287
   col2   -0.858556
   col3   -0.663385
Name: 2, dtype: float64
3  col1    -1.638578
   col2     0.059866
   col3     0.493482
Name: 3, dtype: float64

Note - porque iterrows()iterar nas linhas, não preserva o tipo de dados na linha. 0,1,2 são os índices de linha e col1, col2, col3 são índices de coluna.

itertuples ()

O método itertuples () retornará um iterador que produz uma tupla nomeada para cada linha no DataFrame. O primeiro elemento da tupla será o valor do índice correspondente da linha, enquanto os valores restantes são os valores da linha.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
    print row

Está output é o seguinte -

Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)

Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)

Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)

Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)

Note- Não tente modificar nenhum objeto durante a iteração. A iteração é destinada à leitura e o iterador retorna uma cópia do objeto original (uma visualização), portanto, as alterações não refletirão no objeto original.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])

for index, row in df.iterrows():
   row['a'] = 10
print df

Está output é o seguinte -

col1       col2       col3
0  -1.739815   0.735595  -0.295589
1   0.635485   0.106803   1.527922
2  -0.939064   0.547095   0.038585
3  -1.016509  -0.116580  -0.523158

Observe, nenhuma mudança refletida.

Existem dois tipos de classificação disponíveis no Pandas. Eles são -

  • Por etiqueta
  • Por valor real

Vamos considerar um exemplo com uma saída.

import pandas as pd
import numpy as np

unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns=['col2','col1'])
print unsorted_df

Está output é o seguinte -

col2       col1
1  -2.063177   0.537527
4   0.142932  -0.684884
6   0.012667  -0.389340
2  -0.548797   1.848743
3  -1.044160   0.837381
5   0.385605   1.300185
9   1.031425  -1.002967
8  -0.407374  -0.435142
0   2.237453  -1.067139
7  -1.445831  -1.701035

Dentro unsorted_df, a labels e a valuesnão estão classificados. Vamos ver como eles podem ser classificados.

Por etiqueta

Usando o sort_index(), passando os argumentos do eixo e a ordem de classificação, DataFrame pode ser classificado. Por padrão, a classificação é feita nos rótulos das linhas em ordem crescente.

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])

sorted_df=unsorted_df.sort_index()
print sorted_df

Está output é o seguinte -

col2       col1
0   0.208464   0.627037
1   0.641004   0.331352
2  -0.038067  -0.464730
3  -0.638456  -0.021466
4   0.014646  -0.737438
5  -0.290761  -1.669827
6  -0.797303  -0.018737
7   0.525753   1.628921
8  -0.567031   0.775951
9   0.060724  -0.322425

Ordem de classificação

Ao passar o valor booleano para o parâmetro ascendente, a ordem da classificação pode ser controlada. Vamos considerar o seguinte exemplo para entender o mesmo.

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])

sorted_df = unsorted_df.sort_index(ascending=False)
print sorted_df

Está output é o seguinte -

col2        col1
9    0.825697    0.374463
8   -1.699509    0.510373
7   -0.581378    0.622958
6   -0.202951    0.954300
5   -1.289321   -1.551250
4    1.302561    0.851385
3   -0.157915   -0.388659
2   -1.222295    0.166609
1    0.584890   -0.291048
0    0.668444   -0.061294

Classifique as colunas

Ao passar o argumento do eixo com valor 0 ou 1, a classificação pode ser feita nos rótulos das colunas. Por padrão, eixo = 0, classificar por linha. Vamos considerar o seguinte exemplo para entender o mesmo.

import pandas as pd
import numpy as np
 
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
   mns = ['col2','col1'])
 
sorted_df=unsorted_df.sort_index(axis=1)

print sorted_df

Está output é o seguinte -

col1        col2
1   -0.291048    0.584890
4    0.851385    1.302561
6    0.954300   -0.202951
2    0.166609   -1.222295
3   -0.388659   -0.157915
5   -1.551250   -1.289321
9    0.374463    0.825697
8    0.510373   -1.699509
0   -0.061294    0.668444
7    0.622958   -0.581378

Por valor

Como classificação de índice, sort_values()é o método de classificação por valores. Ele aceita um argumento 'por' que usará o nome da coluna do DataFrame com o qual os valores serão classificados.

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
   sorted_df = unsorted_df.sort_values(by='col1')

print sorted_df

Está output é o seguinte -

col1  col2
1    1    3
2    1    2
3    1    4
0    2    1

Observe, os valores col1 são classificados e o respectivo valor col2 e índice da linha serão alterados junto com col1. Portanto, eles parecem não classificados.

'by' argumento leva uma lista de valores de coluna.

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
   sorted_df = unsorted_df.sort_values(by=['col1','col2'])

print sorted_df

Está output é o seguinte -

col1 col2
2   1   2
1   1   3
3   1   4
0   2   1

Algoritmo de classificação

sort_values()fornece uma opção para escolher o algoritmo de mergesort, heapsort e quicksort. Mergesort é o único algoritmo estável.

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')

print sorted_df

Está output é o seguinte -

col1 col2
1    1    3
2    1    2
3    1    4
0    2    1

Neste capítulo, discutiremos as operações de string com nossa Série / Índice básico. Nos capítulos subsequentes, aprenderemos como aplicar essas funções de string no DataFrame.

O Pandas oferece um conjunto de funções de string que facilitam a operação com dados de string. Mais importante ainda, essas funções ignoram (ou excluem) valores ausentes / NaN.

Quase, todos esses métodos funcionam com funções de string Python (consulte: https://docs.python.org/3/library/stdtypes.html#string-methods) Portanto, converta o objeto de série em objeto de seqüência de caracteres e execute a operação.

Vamos agora ver o desempenho de cada operação.

Sr. Não Descrição da função
1

lower()

Converte strings na série / índice em minúsculas.

2

upper()

Converte strings na série / índice em maiúsculas.

3

len()

Calcula o comprimento da string ().

4

strip()

Ajuda a remover espaços em branco (incluindo nova linha) de cada string na série / índice de ambos os lados.

5

split(' ')

Divide cada string com o padrão fornecido.

6

cat(sep=' ')

Concatena os elementos da série / índice com o separador fornecido.

7

get_dummies()

Retorna o DataFrame com valores One-Hot Encoded.

8

contains(pattern)

Retorna um valor booleano True para cada elemento se a substring contiver o elemento, caso contrário, False.

9

replace(a,b)

Substitui o valor a com o valor b.

10

repeat(value)

Repete cada elemento com o número especificado de vezes.

11

count(pattern)

Retorna a contagem da aparência do padrão em cada elemento.

12

startswith(pattern)

Retorna verdadeiro se o elemento na Série / Índice começar com o padrão.

13

endswith(pattern)

Retorna verdadeiro se o elemento na Série / Índice terminar com o padrão.

14

find(pattern)

Retorna a primeira posição da primeira ocorrência do padrão.

15

findall(pattern)

Retorna uma lista de todas as ocorrências do padrão.

16

swapcase

Troca a caixa entre inferior / superior.

17

islower()

Verifica se todos os caracteres em cada string na Série / Índice estão em minúsculas ou não. Retorna Boolean

18

isupper()

Verifica se todos os caracteres em cada string na Série / Índice estão em maiúsculas ou não. Retorna Boolean.

19

isnumeric()

Verifica se todos os caracteres em cada string na Série / Índice são numéricos. Retorna Boolean.

Vamos agora criar uma série e ver como todas as funções acima funcionam.

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s

Está output é o seguinte -

0            Tom
1   William Rick
2           John
3        Alber@t
4            NaN
5           1234
6    Steve Smith
dtype: object

mais baixo()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s.str.lower()

Está output é o seguinte -

0            tom
1   william rick
2           john
3        alber@t
4            NaN
5           1234
6    steve smith
dtype: object

superior()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])

print s.str.upper()

Está output é o seguinte -

0            TOM
1   WILLIAM RICK
2           JOHN
3        ALBER@T
4            NaN
5           1234
6    STEVE SMITH
dtype: object

len ()

import pandas as pd
import numpy as np

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.len()

Está output é o seguinte -

0    3.0
1   12.0
2    4.0
3    7.0
4    NaN
5    4.0
6   10.0
dtype: float64

faixa()

import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After Stripping:")
print s.str.strip()

Está output é o seguinte -

0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

After Stripping:
0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

divisão (padrão)

import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("Split Pattern:")
print s.str.split(' ')

Está output é o seguinte -

0            Tom
1   William Rick
2           John
3        Alber@t
dtype: object

Split Pattern:
0   [Tom, , , , , , , , , , ]
1   [, , , , , William, Rick]
2   [John]
3   [Alber@t]
dtype: object

gato (sep = padrão)

import pandas as pd
import numpy as np

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.cat(sep='_')

Está output é o seguinte -

Tom _ William Rick_John_Alber@t

get_dummies ()

import pandas as pd
import numpy as np

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.get_dummies()

Está output é o seguinte -

William Rick   Alber@t   John   Tom
0             0         0      0     1
1             1         0      0     0
2             0         0      1     0
3             0         1      0     0

contém ()

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.contains(' ')

Está output é o seguinte -

0   True
1   True
2   False
3   False
dtype: bool

substituir (a, b)

import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After replacing @ with $:") print s.str.replace('@','$')

Está output é o seguinte -

0   Tom
1   William Rick
2   John
3   Alber@t
dtype: object

After replacing @ with $: 0 Tom 1 William Rick 2 John 3 Alber$t
dtype: object

repetir (valor)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.repeat(2)

Está output é o seguinte -

0   Tom            Tom
1   William Rick   William Rick
2                  JohnJohn
3                  Alber@tAlber@t
dtype: object

contagem (padrão)

import pandas as pd
 
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print ("The number of 'm's in each string:")
print s.str.count('m')

Está output é o seguinte -

The number of 'm's in each string:
0    1
1    1
2    0
3    0

começa com (padrão)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print ("Strings that start with 'T':")
print s.str. startswith ('T')

Está output é o seguinte -

0  True
1  False
2  False
3  False
dtype: bool

endswith (padrão)

import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that end with 't':")
print s.str.endswith('t')

Está output é o seguinte -

Strings that end with 't':
0  False
1  False
2  False
3  True
dtype: bool

encontrar (padrão)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.find('e')

Está output é o seguinte -

0  -1
1  -1
2  -1
3   3
dtype: int64

"-1" indica que esse padrão não está disponível no elemento.

findall (padrão)

import pandas as pd

s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])

print s.str.findall('e')

Está output é o seguinte -

0 []
1 []
2 []
3 [e]
dtype: object

Lista nula ([]) indica que esse padrão não está disponível no elemento.

swapcase ()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.swapcase()

Está output é o seguinte -

0  tOM
1  wILLIAM rICK
2  jOHN
3  aLBER@T
dtype: object

é inferior()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.islower()

Está output é o seguinte -

0  False
1  False
2  False
3  False
dtype: bool

isupper ()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])

print s.str.isupper()

Está output é o seguinte -

0  False
1  False
2  False
3  False
dtype: bool

isnumeric ()

import pandas as pd

s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])

print s.str.isnumeric()

Está output é o seguinte -

0  False
1  False
2  False
3  False
dtype: bool

Pandas fornecem API para personalizar alguns aspectos de seu comportamento, a exibição está sendo usada principalmente.

A API é composta por cinco funções relevantes. Eles são -

  • get_option()
  • set_option()
  • reset_option()
  • describe_option()
  • option_context()

Vamos agora entender como as funções operam.

get_option (param)

get_option recebe um único parâmetro e retorna o valor conforme fornecido na saída abaixo -

display.max_rows

Exibe o número padrão de valor. O intérprete lê esse valor e exibe as linhas com esse valor como o limite superior a ser exibido.

import pandas as pd
print pd.get_option("display.max_rows")

Está output é o seguinte -

60

display.max_columns

Exibe o número padrão de valor. O intérprete lê esse valor e exibe as linhas com esse valor como o limite superior a ser exibido.

import pandas as pd
print pd.get_option("display.max_columns")

Está output é o seguinte -

20

Aqui, 60 e 20 são os valores dos parâmetros de configuração padrão.

set_option (param, valor)

set_option leva dois argumentos e define o valor para o parâmetro conforme mostrado abaixo -

display.max_rows

Usando set_option(), podemos alterar o número padrão de linhas a serem exibidas.

import pandas as pd

pd.set_option("display.max_rows",80)

print pd.get_option("display.max_rows")

Está output é o seguinte -

80

display.max_columns

Usando set_option(), podemos alterar o número padrão de linhas a serem exibidas.

import pandas as pd

pd.set_option("display.max_columns",30)

print pd.get_option("display.max_columns")

Está output é o seguinte -

30

reset_option (param)

reset_option recebe um argumento e define o valor de volta para o valor padrão.

display.max_rows

Usando reset_option (), podemos mudar o valor de volta para o número padrão de linhas a serem exibidas.

import pandas as pd

pd.reset_option("display.max_rows")
print pd.get_option("display.max_rows")

Está output é o seguinte -

60

describe_option (param)

describe_option imprime a descrição do argumento.

display.max_rows

Usando reset_option (), podemos mudar o valor de volta para o número padrão de linhas a serem exibidas.

import pandas as pd
pd.describe_option("display.max_rows")

Está output é o seguinte -

display.max_rows : int
   If max_rows is exceeded, switch to truncate view. Depending on
   'large_repr', objects are either centrally truncated or printed as
   a summary view. 'None' value means unlimited.

   In case python/IPython is running in a terminal and `large_repr`
   equals 'truncate' this can be set to 0 and pandas will auto-detect
   the height of the terminal and print a truncated object which fits
   the screen height. The IPython notebook, IPython qtconsole, or
   IDLE do not run in a terminal and hence it is not possible to do
   correct auto-detection.
   [default: 60] [currently: 60]

option_context ()

o gerenciador de contexto option_context é usado para definir a opção em with statementtemporariamente. Os valores das opções são restaurados automaticamente quando você sai dowith block -

display.max_rows

Usando option_context (), podemos definir o valor temporariamente.

import pandas as pd
with pd.option_context("display.max_rows",10):
   print(pd.get_option("display.max_rows"))
   print(pd.get_option("display.max_rows"))

Está output é o seguinte -

10
10

Veja, a diferença entre a primeira e a segunda declaração de impressão. A primeira instrução imprime o valor definido poroption_context() que é temporário dentro do with contextem si. Depois dewith context, a segunda instrução de impressão imprime o valor configurado.

Parâmetros usados ​​com frequência

Sr. Não Parâmetro e Descrição
1

display.max_rows

Exibe o número máximo de linhas para exibir

2

2 display.max_columns

Exibe o número máximo de colunas para exibir

3

display.expand_frame_repr

Exibe DataFrames para esticar páginas

4

display.max_colwidth

Exibe a largura máxima da coluna

5

display.precision

Exibe precisão para números decimais

Neste capítulo, discutiremos como fatiar e dividir a data e, geralmente, obter o subconjunto do objeto pandas.

Os operadores de indexação Python e NumPy "[]" e o operador de atributo "." fornecem acesso rápido e fácil às estruturas de dados do Pandas em uma ampla variedade de casos de uso. No entanto, como o tipo de dados a ser acessado não é conhecido com antecedência, o uso direto de operadores padrão tem alguns limites de otimização. Para código de produção, recomendamos que você tire vantagem dos métodos otimizados de acesso a dados do pandas explicados neste capítulo.

O Pandas agora oferece suporte a três tipos de indexação Multi-eixos; os três tipos são mencionados na tabela a seguir -

Sr. Não Indexação e descrição
1

.loc()

Com base em rótulo

2

.iloc()

Baseado em inteiro

3

.ix()

Com base em rótulo e número inteiro

.loc ()

Pandas fornecem vários métodos para ter puramente label based indexing. Ao fatiar, o limite inicial também é incluído. Os inteiros são rótulos válidos, mas eles se referem ao rótulo e não à posição.

.loc() tem vários métodos de acesso como -

  • Um único rótulo escalar
  • Uma lista de rótulos
  • Um objeto de fatia
  • Uma matriz booleana

locleva dois operadores únicos / lista / intervalo separados por ','. O primeiro indica a linha e o segundo indica as colunas.

Exemplo 1

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

#select all rows for a specific column
print df.loc[:,'A']

Está output é o seguinte -

a   0.391548
b  -0.070649
c  -0.317212
d  -2.162406
e   2.202797
f   0.613709
g   1.050559
h   1.122680
Name: A, dtype: float64

Exemplo 2

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select all rows for multiple columns, say list[]
print df.loc[:,['A','C']]

Está output é o seguinte -

A           C
a    0.391548    0.745623
b   -0.070649    1.620406
c   -0.317212    1.448365
d   -2.162406   -0.873557
e    2.202797    0.528067
f    0.613709    0.286414
g    1.050559    0.216526
h    1.122680   -1.621420

Exemplo 3

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select few rows for multiple columns, say list[]
print df.loc[['a','b','f','h'],['A','C']]

Está output é o seguinte -

A          C
a   0.391548   0.745623
b  -0.070649   1.620406
f   0.613709   0.286414
h   1.122680  -1.621420

Exemplo 4

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select range of rows for all columns
print df.loc['a':'h']

Está output é o seguinte -

A           B          C          D
a    0.391548   -0.224297   0.745623   0.054301
b   -0.070649   -0.880130   1.620406   1.419743
c   -0.317212   -1.929698   1.448365   0.616899
d   -2.162406    0.614256  -0.873557   1.093958
e    2.202797   -2.315915   0.528067   0.612482
f    0.613709   -0.157674   0.286414  -0.500517
g    1.050559   -2.272099   0.216526   0.928449
h    1.122680    0.324368  -1.621420  -0.741470

Exemplo 5

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# for getting values with a boolean array
print df.loc['a']>0

Está output é o seguinte -

A  False
B  True
C  False
D  False
Name: a, dtype: bool

.iloc ()

O Pandas fornece vários métodos para obter indexação puramente baseada em inteiros. Como python e numpy, estes são0-based indexação.

Os vários métodos de acesso são os seguintes -

  • Um inteiro
  • Uma lista de inteiros
  • Uma gama de valores

Exemplo 1

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# select all rows for a specific column
print df.iloc[:4]

Está output é o seguinte -

A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print df.iloc[:4]
print df.iloc[1:5, 2:4]

Está output é o seguinte -

A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

           C          D
1  -0.813012   0.631615
2   0.025070   0.230806
3   0.826977  -0.026251
4   1.423332   1.130568

Exemplo 3

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Slicing through list of values
print df.iloc[[1, 3, 5], [1, 3]]
print df.iloc[1:3, :]
print df.iloc[:,1:3]

Está output é o seguinte -

B           D
1   0.890791    0.631615
3  -1.284314   -0.026251
5  -0.512888   -0.518930

           A           B           C           D
1  -0.685354    0.890791   -0.813012    0.631615
2  -0.783192   -0.531378    0.025070    0.230806

           B           C
0   0.256239   -1.270702
1   0.890791   -0.813012
2  -0.531378    0.025070
3  -1.284314    0.826977
4  -0.460729    1.423332
5  -0.512888    0.581409
6  -1.204853    0.098060
7  -0.947857    0.641358

.ix ()

Além de baseado em rótulo puro e baseado em inteiro, Pandas fornece um método híbrido para seleções e subconjuntos do objeto usando o operador .ix ().

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print df.ix[:4]

Está output é o seguinte -

A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print df.ix[:,'A']

Está output é o seguinte -

0   0.699435
1  -0.685354
2  -0.783192
3   0.539042
4  -1.044209
5  -1.415411
6   1.062095
7   0.994204
Name: A, dtype: float64

Uso de notações

Obter valores do objeto Pandas com indexação Multi-eixos usa a seguinte notação -

Objeto Indexadores Tipo de Devolução
Series s.loc [indexador] Valor escalar
Quadro de dados df.loc [row_index, col_index] Objeto de série
Painel p.loc [item_index, major_index, minor_index] p.loc [item_index, major_index, minor_index]

Note − .iloc() & .ix() aplica as mesmas opções de indexação e valor de retorno.

Vamos agora ver como cada operação pode ser executada no objeto DataFrame. Usaremos o operador de indexação básico '[]' -

Exemplo 1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df['A']

Está output é o seguinte -

0  -0.478893
1   0.391931
2   0.336825
3  -1.055102
4  -0.165218
5  -0.328641
6   0.567721
7  -0.759399
Name: A, dtype: float64

Note - Podemos passar uma lista de valores para [] para selecionar essas colunas.

Exemplo 2

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print df[['A','B']]

Está output é o seguinte -

A           B
0  -0.478893   -0.606311
1   0.391931   -0.949025
2   0.336825    0.093717
3  -1.055102   -0.012944
4  -0.165218    1.550310
5  -0.328641   -0.226363
6   0.567721   -0.312585
7  -0.759399   -0.372696

Exemplo 3

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[2:2]

Está output é o seguinte -

Columns: [A, B, C, D]
Index: []

Acesso de Atributo

As colunas podem ser selecionadas usando o operador de atributo '.'.

Exemplo

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print df.A

Está output é o seguinte -

0   -0.478893
1    0.391931
2    0.336825
3   -1.055102
4   -0.165218
5   -0.328641
6    0.567721
7   -0.759399
Name: A, dtype: float64

Os métodos estatísticos auxiliam na compreensão e análise do comportamento dos dados. Vamos agora aprender algumas funções estatísticas, que podemos aplicar em objetos Pandas.

Mudança percentual

Series, DatFrames e Panel, todos têm a função pct_change(). Esta função compara cada elemento com seu elemento anterior e calcula a porcentagem de alteração.

import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4,5,4])
print s.pct_change()

df = pd.DataFrame(np.random.randn(5, 2))
print df.pct_change()

Está output é o seguinte -

0        NaN
1   1.000000
2   0.500000
3   0.333333
4   0.250000
5  -0.200000
dtype: float64

            0          1
0         NaN        NaN
1  -15.151902   0.174730
2  -0.746374   -1.449088
3  -3.582229   -3.165836
4   15.601150  -1.860434

Por padrão, o pct_change()opera em colunas; se você quiser aplicar a mesma linha, useaxis=1() argumento.

Covariância

A covariância é aplicada aos dados da série. O objeto Series tem um método cov para calcular a covariância entre os objetos da série. NA será excluído automaticamente.

Cov Series

import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print s1.cov(s2)

Está output é o seguinte -

-0.12978405324

Método de covariância quando aplicado em um DataFrame, calcula cov entre todas as colunas.

import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].cov(frame['b'])
print frame.cov()

Está output é o seguinte -

-0.58312921152741437

           a           b           c           d            e
a   1.780628   -0.583129   -0.185575    0.003679    -0.136558
b  -0.583129    1.297011    0.136530   -0.523719     0.251064
c  -0.185575    0.136530    0.915227   -0.053881    -0.058926
d   0.003679   -0.523719   -0.053881    1.521426    -0.487694
e  -0.136558    0.251064   -0.058926   -0.487694     0.960761

Note - Observe o cov entre a e b coluna na primeira instrução e o mesmo é o valor retornado por cov no DataFrame.

Correlação

A correlação mostra a relação linear entre quaisquer duas matrizes de valores (séries). Existem vários métodos para calcular a correlação, como Pearson (padrão), Spearman e Kendall.

import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])

print frame['a'].corr(frame['b'])
print frame.corr()

Está output é o seguinte -

-0.383712785514

           a          b          c          d           e
a   1.000000  -0.383713  -0.145368   0.002235   -0.104405
b  -0.383713   1.000000   0.125311  -0.372821    0.224908
c  -0.145368   0.125311   1.000000  -0.045661   -0.062840
d   0.002235  -0.372821  -0.045661   1.000000   -0.403380
e  -0.104405   0.224908  -0.062840  -0.403380    1.000000

Se qualquer coluna não numérica estiver presente no DataFrame, ela será excluída automaticamente.

Classificação de dados

A classificação de dados produz uma classificação para cada elemento na matriz de elementos. Em caso de empate, atribui a classificação média.

import pandas as pd
import numpy as np

s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['b'] # so there's a tie
print s.rank()

Está output é o seguinte -

a  1.0
b  3.5
c  2.0
d  3.5
e  5.0
dtype: float64

A classificação opcionalmente leva um parâmetro crescente que por padrão é verdadeiro; quando falso, os dados são classificados de forma reversa, com valores maiores atribuídos a uma classificação menor.

Rank suporta diferentes métodos de desempate, especificados com o parâmetro method -

  • average - classificação média do grupo empatado

  • min - classificação mais baixa no grupo

  • max - classificação mais alta do grupo

  • first - classificações atribuídas na ordem em que aparecem na matriz

Para trabalhar com dados numéricos, o Pandas fornece algumas variantes, como pesos de rolagem, expansão e movimentação exponencial para estatísticas de janela. Entre estes estãosum, mean, median, variance, covariance, correlation, etc.

Agora aprenderemos como cada um deles pode ser aplicado em objetos DataFrame.

Função .rolling ()

Esta função pode ser aplicada a uma série de dados. Especifique owindow=n argumento e aplique a função estatística apropriada sobre ele.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()

Está output é o seguinte -

A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.628267   -0.047040   -0.287467   -0.161110
2000-01-05   0.398233    0.003517    0.099126   -0.405565
2000-01-06   0.641798    0.656184   -0.322728    0.428015
2000-01-07   0.188403    0.010913   -0.708645    0.160932
2000-01-08   0.188043   -0.253039   -0.818125   -0.108485
2000-01-09   0.682819   -0.606846   -0.178411   -0.404127
2000-01-10   0.688583    0.127786    0.513832   -1.067156

Note - Como o tamanho da janela é 3, para os dois primeiros elementos há nulos e a partir do terceiro o valor será a média do n, n-1 e n-2elementos Assim, também podemos aplicar várias funções conforme mencionado acima.

Função .expanding ()

Esta função pode ser aplicada a uma série de dados. Especifique omin_periods=n argumento e aplique a função estatística apropriada sobre ele.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()

Está output é o seguinte -

A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.743328   -0.198015   -0.852462   -0.262547
2000-01-05   0.614776   -0.205649   -0.583641   -0.303254
2000-01-06   0.538175   -0.005878   -0.687223   -0.199219
2000-01-07   0.505503   -0.108475   -0.790826   -0.081056
2000-01-08   0.454751   -0.223420   -0.671572   -0.230215
2000-01-09   0.586390   -0.206201   -0.517619   -0.267521
2000-01-10   0.560427   -0.037597   -0.399429   -0.376886

Função .ewm ()

ewmé aplicado em uma série de dados. Especifique qualquer um dos com, span,halflifeargumento e aplique a função estatística apropriada sobre ele. Ele atribui os pesos exponencialmente.

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   0.865131   -0.453626   -1.137961    0.058747
2000-01-03  -0.132245   -0.807671   -0.308308   -1.491002
2000-01-04   1.084036    0.555444   -0.272119    0.480111
2000-01-05   0.425682    0.025511    0.239162   -0.153290
2000-01-06   0.245094    0.671373   -0.725025    0.163310
2000-01-07   0.288030   -0.259337   -1.183515    0.473191
2000-01-08   0.162317   -0.771884   -0.285564   -0.692001
2000-01-09   1.147156   -0.302900    0.380851   -0.607976
2000-01-10   0.600216    0.885614    0.569808   -1.110113

As funções de janela são usadas principalmente para encontrar as tendências nos dados graficamente, suavizando a curva. Se houver muita variação nos dados diários e muitos pontos de dados estiverem disponíveis, pegar as amostras e plotar é um método e aplicar os cálculos da janela e plotar o gráfico nos resultados é outro método. Por meio desses métodos, podemos suavizar a curva ou a tendência.

Depois de rolar, expandir e ewm objetos são criados, vários métodos estão disponíveis para realizar agregações em dados.

Aplicação de agregações no DataFrame

Vamos criar um DataFrame e aplicar agregações nele.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])

print df
r = df.rolling(window=3,min_periods=1)
print r

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   0.790670   -0.387854   -0.668132    0.267283
2000-01-03  -0.575523   -0.965025    0.060427   -2.179780
2000-01-04   1.669653    1.211759   -0.254695    1.429166
2000-01-05   0.100568   -0.236184    0.491646   -0.466081
2000-01-06   0.155172    0.992975   -1.205134    0.320958
2000-01-07   0.309468   -0.724053   -1.412446    0.627919
2000-01-08   0.099489   -1.028040    0.163206   -1.274331
2000-01-09   1.639500   -0.068443    0.714008   -0.565969
2000-01-10   0.326761    1.479841    0.664282   -1.361169

Rolling [window=3,min_periods=1,center=False,axis=0]

Podemos agregar passando uma função para todo o DataFrame ou selecionar uma coluna por meio do padrão get item método.

Aplicar agregação em um Dataframe inteiro

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum)

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469

                    A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469

Aplicar agregação em uma única coluna de um Dataframe

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate(np.sum)

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
2000-01-01   1.088512
2000-01-02   1.879182
2000-01-03   1.303660
2000-01-04   1.884801
2000-01-05   1.194699
2000-01-06   1.925393
2000-01-07   0.565208
2000-01-08   0.564129
2000-01-09   2.048458
2000-01-10   2.065750
Freq: D, Name: A, dtype: float64

Aplicar agregação em várias colunas de um DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate(np.sum)

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                    A           B
2000-01-01   1.088512   -0.650942
2000-01-02   1.879182   -1.038796
2000-01-03   1.303660   -2.003821
2000-01-04   1.884801   -0.141119
2000-01-05   1.194699    0.010551
2000-01-06   1.925393    1.968551
2000-01-07   0.565208    0.032738
2000-01-08   0.564129   -0.759118
2000-01-09   2.048458   -1.820537
2000-01-10   2.065750    0.383357

Aplicar múltiplas funções em uma única coluna de um DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate([np.sum,np.mean])

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                  sum       mean
2000-01-01   1.088512   1.088512
2000-01-02   1.879182   0.939591
2000-01-03   1.303660   0.434553
2000-01-04   1.884801   0.628267
2000-01-05   1.194699   0.398233
2000-01-06   1.925393   0.641798
2000-01-07   0.565208   0.188403
2000-01-08   0.564129   0.188043
2000-01-09   2.048458   0.682819
2000-01-10   2.065750   0.688583

Aplicar várias funções em várias colunas de um DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate([np.sum,np.mean])

Está output é o seguinte -

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
                    A                      B
                  sum       mean         sum        mean
2000-01-01   1.088512   1.088512   -0.650942   -0.650942
2000-01-02   1.879182   0.939591   -1.038796   -0.519398
2000-01-03   1.303660   0.434553   -2.003821   -0.667940
2000-01-04   1.884801   0.628267   -0.141119   -0.047040
2000-01-05   1.194699   0.398233    0.010551    0.003517
2000-01-06   1.925393   0.641798    1.968551    0.656184
2000-01-07   0.565208   0.188403    0.032738    0.010913
2000-01-08   0.564129   0.188043   -0.759118   -0.253039
2000-01-09   2.048458   0.682819   -1.820537   -0.606846
2000-01-10   2.065750   0.688583    0.383357    0.127786

Aplicar diferentes funções a diferentes colunas de um dataframe

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(3, 4),
   index = pd.date_range('1/1/2000', periods=3),
   columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate({'A' : np.sum,'B' : np.mean})

Está output é o seguinte -

A          B          C         D
2000-01-01  -1.575749  -1.018105   0.317797  0.545081
2000-01-02  -0.164917  -1.361068   0.258240  1.113091
2000-01-03   1.258111   1.037941  -0.047487  0.867371
                    A          B
2000-01-01  -1.575749  -1.018105
2000-01-02  -1.740666  -1.189587
2000-01-03  -0.482555  -0.447078

Dados ausentes são sempre um problema em cenários da vida real. Áreas como aprendizado de máquina e mineração de dados enfrentam problemas graves na precisão de suas previsões de modelo devido à baixa qualidade dos dados causada por valores ausentes. Nessas áreas, o tratamento de valor faltante é o principal ponto de foco para tornar seus modelos mais precisos e válidos.

Quando e por que os dados estão perdidos?

Vamos considerar uma pesquisa online para um produto. Muitas vezes, as pessoas não compartilham todas as informações relacionadas a elas. Poucas pessoas compartilham sua experiência, mas não há quanto tempo estão usando o produto; poucas pessoas compartilham há quanto tempo estão usando o produto, sua experiência, mas não suas informações de contato. Assim, de uma forma ou de outra sempre falta uma parte dos dados, e isso é muito comum em tempo real.

Vamos agora ver como podemos lidar com valores ausentes (digamos NA ou NaN) usando o Pandas.

# import the pandas library
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df

Está output é o seguinte -

one        two      three
a   0.077988   0.476149   0.965836
b        NaN        NaN        NaN
c  -0.390208  -0.551605  -2.301950
d        NaN        NaN        NaN
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g        NaN        NaN        NaN
h   0.085100   0.532791   0.887415

Usando a reindexação, criamos um DataFrame com valores ausentes. Na saída,NaN significa Not a Number.

Verifique se há valores ausentes

Para tornar a detecção de valores ausentes mais fácil (e entre diferentes tipos de matriz), o Pandas fornece o isnull() e notnull() funções, que também são métodos em objetos Series e DataFrame -

Exemplo 1

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].isnull()

Está output é o seguinte -

a  False
b  True
c  False
d  True
e  False
f  False
g  True
h  False
Name: one, dtype: bool

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].notnull()

Está output é o seguinte -

a  True
b  False
c  True
d  False
e  True
f  True
g  False
h  True
Name: one, dtype: bool

Cálculos com dados ausentes

  • Ao somar os dados, NA será tratado como Zero
  • Se os dados forem todos NA, o resultado será NA

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].sum()

Está output é o seguinte -

2.02357685917

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()

Está output é o seguinte -

nan

Limpeza / preenchimento de dados ausentes

O Pandas fornece vários métodos para limpar os valores ausentes. A função fillna pode “preencher” os valores NA com dados não nulos de algumas maneiras, que ilustramos nas seções a seguir.

Substitua NaN por um valor escalar

O programa a seguir mostra como você pode substituir "NaN" por "0".

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])

df = df.reindex(['a', 'b', 'c'])

print df
print ("NaN replaced with '0':")
print df.fillna(0)

Está output é o seguinte -

one        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c   0.744328  -1.735166  1.749580

NaN replaced with '0':
         one        two     three
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c   0.744328  -1.735166  1.749580

Aqui, estamos preenchendo com valor zero; em vez disso, também podemos preencher com qualquer outro valor.

Preencher NA para frente e para trás

Usando os conceitos de preenchimento discutidos no Capítulo ReIndexação, preencheremos os valores ausentes.

Sr. Não Método e Ação
1

pad/fill

Métodos de preenchimento para frente

2

bfill/backfill

Métodos de preenchimento para trás

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df.fillna(method='pad')

Está output é o seguinte -

one        two      three
a   0.077988   0.476149   0.965836
b   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
d  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df.fillna(method='backfill')

Está output é o seguinte -

one        two      three
a   0.077988   0.476149   0.965836
b  -0.390208  -0.551605  -2.301950
c  -0.390208  -0.551605  -2.301950
d  -2.000303  -0.788201   1.510072
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g   0.085100   0.532791   0.887415
h   0.085100   0.532791   0.887415

Abandone os valores ausentes

Se você deseja simplesmente excluir os valores ausentes, use o dropna funcionar junto com o axisargumento. Por padrão, eixo = 0, ou seja, ao longo da linha, o que significa que se qualquer valor dentro de uma linha for NA, toda a linha é excluída.

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()

Está output é o seguinte -

one        two      three
a   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)

Está output é o seguinte -

Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]

Substituir Valores Ausentes (ou) Genéricos

Muitas vezes, temos que substituir um valor genérico por algum valor específico. Podemos conseguir isso aplicando o método de substituição.

Substituir NA por um valor escalar é um comportamento equivalente do fillna() função.

Exemplo 1

import pandas as pd
import numpy as np

df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})

print df.replace({1000:10,2000:60})

Está output é o seguinte -

one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60

Exemplo 2

import pandas as pd
import numpy as np

df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})

Está output é o seguinte -

one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60

Qualquer groupbyoperação envolve uma das seguintes operações no objeto original. Eles são -

  • Splitting o objeto

  • Applying uma função

  • Combining os resultados

Em muitas situações, dividimos os dados em conjuntos e aplicamos algumas funcionalidades em cada subconjunto. Na funcionalidade de aplicação, podemos realizar as seguintes operações -

  • Aggregation - calcular uma estatística resumida

  • Transformation - realizar alguma operação específica do grupo

  • Filtration - descartar os dados com alguma condição

Vamos agora criar um objeto DataFrame e realizar todas as operações nele -

#import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df

Está output é o seguinte -

Points   Rank     Team   Year
0      876      1   Riders   2014
1      789      2   Riders   2015
2      863      2   Devils   2014
3      673      3   Devils   2015
4      741      3    Kings   2014
5      812      4    kings   2015
6      756      1    Kings   2016
7      788      1    Kings   2017
8      694      2   Riders   2016
9      701      4   Royals   2014
10     804      1   Royals   2015
11     690      2   Riders   2017

Dividir dados em grupos

O objeto Pandas pode ser dividido em qualquer um de seus objetos. Existem várias maneiras de dividir um objeto como -

  • obj.groupby('key')
  • obj.groupby(['key1','key2'])
  • obj.groupby(key,axis=1)

Vamos agora ver como os objetos de agrupamento podem ser aplicados ao objeto DataFrame

Exemplo

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team')

Está output é o seguinte -

<pandas.core.groupby.DataFrameGroupBy object at 0x7fa46a977e50>

Ver Grupos

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team').groups

Está output é o seguinte -

{'Kings': Int64Index([4, 6, 7],      dtype='int64'),
'Devils': Int64Index([2, 3],         dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11],  dtype='int64'),
'Royals': Int64Index([9, 10],        dtype='int64'),
'kings' : Int64Index([5],            dtype='int64')}

Exemplo

Group by com várias colunas -

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby(['Team','Year']).groups

Está output é o seguinte -

{('Kings', 2014): Int64Index([4], dtype='int64'),
 ('Royals', 2014): Int64Index([9], dtype='int64'),
 ('Riders', 2014): Int64Index([0], dtype='int64'),
 ('Riders', 2015): Int64Index([1], dtype='int64'),
 ('Kings', 2016): Int64Index([6], dtype='int64'),
 ('Riders', 2016): Int64Index([8], dtype='int64'),
 ('Riders', 2017): Int64Index([11], dtype='int64'),
 ('Devils', 2014): Int64Index([2], dtype='int64'),
 ('Devils', 2015): Int64Index([3], dtype='int64'),
 ('kings', 2015): Int64Index([5], dtype='int64'),
 ('Royals', 2015): Int64Index([10], dtype='int64'),
 ('Kings', 2017): Int64Index([7], dtype='int64')}

Iterando por grupos

Com o groupby objeto em mãos, podemos iterar por meio do objeto semelhante a itertools.obj.

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')

for name,group in grouped:
   print name
   print group

Está output é o seguinte -

2014
   Points  Rank     Team   Year
0     876     1   Riders   2014
2     863     2   Devils   2014
4     741     3   Kings    2014
9     701     4   Royals   2014

2015
   Points  Rank     Team   Year
1     789     2   Riders   2015
3     673     3   Devils   2015
5     812     4    kings   2015
10    804     1   Royals   2015

2016
   Points  Rank     Team   Year
6     756     1    Kings   2016
8     694     2   Riders   2016

2017
   Points  Rank    Team   Year
7     788     1   Kings   2017
11    690     2  Riders   2017

Por padrão, o groupby objeto tem o mesmo nome de rótulo que o nome do grupo.

Selecione um Grupo

Usando o get_group() método, podemos selecionar um único grupo.

# import the pandas library
import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')
print grouped.get_group(2014)

Está output é o seguinte -

Points  Rank     Team    Year
0     876     1   Riders    2014
2     863     2   Devils    2014
4     741     3   Kings     2014
9     701     4   Royals    2014

Agregações

Uma função agregada retorna um único valor agregado para cada grupo. Uma vez ogroup by objeto é criado, várias operações de agregação podem ser realizadas nos dados agrupados.

Um óbvio é a agregação por meio do agregado ou equivalente agg método -

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Year')
print grouped['Points'].agg(np.mean)

Está output é o seguinte -

Year
2014   795.25
2015   769.50
2016   725.00
2017   739.00
Name: Points, dtype: float64

Outra maneira de ver o tamanho de cada grupo é aplicando a função size () -

import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

Attribute Access in Python Pandas
grouped = df.groupby('Team')
print grouped.agg(np.size)

Está output é o seguinte -

Points   Rank   Year
Team
Devils        2      2      2
Kings         3      3      3
Riders        4      4      4
Royals        2      2      2
kings         1      1      1

Aplicação de múltiplas funções de agregação de uma só vez

Com as séries agrupadas, você também pode passar um list ou dict of functions para fazer agregação e gerar DataFrame como saída -

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Team')
print grouped['Points'].agg([np.sum, np.mean, np.std])

Está output é o seguinte -

Team      sum      mean          std
Devils   1536   768.000000   134.350288
Kings    2285   761.666667    24.006943
Riders   3049   762.250000    88.567771
Royals   1505   752.500000    72.831998
kings     812   812.000000          NaN

Transformações

A transformação em um grupo ou coluna retorna um objeto indexado com o mesmo tamanho daquele que está sendo agrupado. Portanto, a transformação deve retornar um resultado do mesmo tamanho que o de um bloco de grupo.

# import the pandas library
import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

grouped = df.groupby('Team')
score = lambda x: (x - x.mean()) / x.std()*10
print grouped.transform(score)

Está output é o seguinte -

Points        Rank        Year
0   12.843272  -15.000000  -11.618950
1   3.020286     5.000000   -3.872983
2   7.071068    -7.071068   -7.071068
3  -7.071068     7.071068    7.071068
4  -8.608621    11.547005  -10.910895
5        NaN          NaN         NaN
6  -2.360428    -5.773503    2.182179
7  10.969049    -5.773503    8.728716
8  -7.705963     5.000000    3.872983
9  -7.071068     7.071068   -7.071068
10  7.071068    -7.071068    7.071068
11 -8.157595     5.000000   11.618950

Filtração

A filtragem filtra os dados em um critério definido e retorna o subconjunto de dados. ofilter() função é usada para filtrar os dados.

import pandas as pd
import numpy as np

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)

print df.groupby('Team').filter(lambda x: len(x) >= 3)

Está output é o seguinte -

Points  Rank     Team   Year
0      876     1   Riders   2014
1      789     2   Riders   2015
4      741     3   Kings    2014
6      756     1   Kings    2016
7      788     1   Kings    2017
8      694     2   Riders   2016
11     690     2   Riders   2017

Na condição de filtro acima, estamos solicitando o retorno das equipes que participaram três ou mais vezes do IPL.

O Pandas tem operações de junção na memória de alto desempenho e com recursos completos, de forma idiomática, muito semelhantes a bancos de dados relacionais como SQL.

O Pandas oferece uma única função, merge, como o ponto de entrada para todas as operações de junção de banco de dados padrão entre objetos DataFrame -

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)

Aqui, usamos os seguintes parâmetros -

  • left - Um objeto DataFrame.

  • right - Outro objeto DataFrame.

  • on- Colunas (nomes) para unir. Deve ser encontrado nos objetos DataFrame esquerdo e direito.

  • left_on- Colunas do DataFrame esquerdo para usar como chaves. Podem ser nomes de colunas ou matrizes com comprimento igual ao comprimento do DataFrame.

  • right_on- Colunas do DataFrame certo para usar como chaves. Podem ser nomes de colunas ou matrizes com comprimento igual ao comprimento do DataFrame.

  • left_index - se True,use o índice (rótulos de linha) do DataFrame esquerdo como sua (s) chave (s) de junção. No caso de um DataFrame com MultiIndex (hierárquico), o número de níveis deve corresponder ao número de chaves de junção do DataFrame correto.

  • right_index - Mesmo uso que left_index para o DataFrame correto.

  • how- Um de 'esquerda', 'direita', 'externo', 'interno'. O padrão é interno. Cada método foi descrito abaixo.

  • sort- Classifique o DataFrame de resultado pelas chaves de junção em ordem lexicográfica. O padrão é True, definir como False melhorará o desempenho substancialmente em muitos casos.

Vamos agora criar dois DataFrames diferentes e realizar as operações de fusão neles.

# import the pandas library
import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right

Está output é o seguinte -

Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5

    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5

Mesclar dois DataFrames em uma chave

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')

Está output é o seguinte -

Name_x   id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5

Mesclar dois DataFrames em várias chaves

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])

Está output é o seguinte -

Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

Mesclar usando o argumento 'como'

o howargumento para mesclar especifica como determinar quais chaves devem ser incluídas na tabela resultante. Se uma combinação de teclas não aparecer nas tabelas da esquerda ou da direita, os valores na tabela associada serão NA.

Aqui está um resumo do how opções e seus nomes equivalentes em SQL -

Método de fusão SQL equivalente Descrição
esquerda LEFT OUTER JOIN Use as chaves do objeto esquerdo
direito DIREITO OUTER JOIN Use as chaves do objeto certo
exterior FULL OUTER JOIN Use a união de chaves
interior JUNÇÃO INTERNA Use a interseção de chaves

Associação à esquerda

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')

Está output é o seguinte -

Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0

Junção certa

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')

Está output é o seguinte -

Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3

Junção Externa

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')

Está output é o seguinte -

Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0

Junção interna

A adesão será realizada no índice. A operação de junção honra o objeto no qual é chamada. Então,a.join(b) não é igual a b.join(a).

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')

Está output é o seguinte -

Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5

Pandas oferece várias facilidades para combinar facilmente Series, DataFrame, e Panel objetos.

pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
  • objs - Esta é uma sequência ou mapeamento de objetos Series, DataFrame ou Panel.

  • axis - {0, 1, ...}, padrão 0. Este é o eixo ao longo do qual concatenar.

  • join- {'interno', 'externo'}, padrão 'externo'. Como lidar com índices em outro (s) eixo (s). Externo para união e interno para interseção.

  • ignore_index- booleano, padrão False. Se for True, não use os valores de índice no eixo de concatenação. O eixo resultante será rotulado 0, ..., n - 1.

  • join_axes- Esta é a lista de objetos de índice. Índices específicos a serem usados ​​para os outros (n-1) eixos em vez de realizar a lógica de definição interna / externa.

Objetos de concatenação

o concatA função faz todo o trabalho pesado de realizar operações de concatenação ao longo de um eixo. Vamos criar objetos diferentes e fazer concatenação.

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two])

Está output é o seguinte -

Marks_scored     Name   subject_id
1             98     Alex         sub1
2             90      Amy         sub2
3             87    Allen         sub4
4             69    Alice         sub6
5             78   Ayoung         sub5
1             89    Billy         sub2
2             80    Brian         sub4
3             79     Bran         sub3
4             97    Bryce         sub6
5             88    Betty         sub5

Suponha que desejamos associar chaves específicas a cada uma das partes do DataFrame fragmentado. Podemos fazer isso usando okeys argumento -

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'])

Está output é o seguinte -

x  1  98    Alex    sub1
   2  90    Amy     sub2
   3  87    Allen   sub4
   4  69    Alice   sub6
   5  78    Ayoung  sub5
y  1  89    Billy   sub2
   2  80    Brian   sub4
   3  79    Bran    sub3
   4  97    Bryce   sub6
   5  88    Betty   sub5

O índice do resultante é duplicado; cada índice é repetido.

Se o objeto resultante tiver que seguir sua própria indexação, defina ignore_index para True.

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'],ignore_index=True)

Está output é o seguinte -

Marks_scored     Name    subject_id
0             98     Alex          sub1
1             90      Amy          sub2
2             87    Allen          sub4
3             69    Alice          sub6
4             78   Ayoung          sub5
5             89    Billy          sub2
6             80    Brian          sub4
7             79     Bran          sub3
8             97    Bryce          sub6
9             88    Betty          sub5

Observe, o índice muda completamente e as Chaves também são substituídas.

Se dois objetos precisam ser adicionados junto axis=1, então as novas colunas serão anexadas.

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print pd.concat([one,two],axis=1)

Está output é o seguinte -

Marks_scored    Name  subject_id   Marks_scored    Name   subject_id
1           98      Alex      sub1         89         Billy         sub2
2           90       Amy      sub2         80         Brian         sub4
3           87     Allen      sub4         79          Bran         sub3
4           69     Alice      sub6         97         Bryce         sub6
5           78    Ayoung      sub5         88         Betty         sub5

Concatenando usando append

Um atalho útil para concat são os métodos de instância anexar em Series e DataFrame. Na verdade, esses métodos são anteriores ao concat. Eles se concatenam juntoaxis=0, ou seja, o índice -

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print one.append(two)

Está output é o seguinte -

Marks_scored    Name  subject_id
1           98      Alex      sub1
2           90       Amy      sub2
3           87     Allen      sub4
4           69     Alice      sub6
5           78    Ayoung      sub5
1           89     Billy      sub2
2           80     Brian      sub4
3           79      Bran      sub3
4           97     Bryce      sub6
5           88     Betty      sub5

o append função pode levar vários objetos também -

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print one.append([two,one,two])

Está output é o seguinte -

Marks_scored   Name    subject_id
1           98     Alex          sub1
2           90      Amy          sub2
3           87    Allen          sub4
4           69    Alice          sub6
5           78   Ayoung          sub5
1           89    Billy          sub2
2           80    Brian          sub4
3           79     Bran          sub3
4           97    Bryce          sub6
5           88    Betty          sub5
1           98     Alex          sub1
2           90      Amy          sub2
3           87    Allen          sub4
4           69    Alice          sub6
5           78   Ayoung          sub5
1           89    Billy          sub2
2           80    Brian          sub4
3           79     Bran          sub3
4           97    Bryce          sub6
5           88    Betty          sub5

Série Temporal

O Pandas fornece uma ferramenta robusta para o tempo de trabalho com dados de séries temporais, especialmente no setor financeiro. Ao trabalhar com dados de série temporal, frequentemente encontramos o seguinte:

  • Gerando sequência de tempo
  • Converta a série temporal em diferentes frequências

O Pandas fornece um conjunto de ferramentas relativamente compacto e independente para executar as tarefas acima.

Obtenha a hora atual

datetime.now() fornece a data e a hora atuais.

import pandas as pd

print pd.datetime.now()

Está output é o seguinte -

2017-05-11 06:10:13.393147

Crie um TimeStamp

Os dados com registro de data e hora são o tipo mais básico de dados de série temporal que associa valores a pontos no tempo. Para objetos pandas, significa usar os pontos no tempo. Vamos dar um exemplo -

import pandas as pd

print pd.Timestamp('2017-03-01')

Está output é o seguinte -

2017-03-01 00:00:00

Também é possível converter tempos inteiros ou períodos flutuantes. A unidade padrão para isso é nanossegundos (já que é assim que os timestamps são armazenados). No entanto, muitas vezes as épocas são armazenadas em outra unidade que pode ser especificada. Vamos dar outro exemplo

import pandas as pd

print pd.Timestamp(1587687255,unit='s')

Está output é o seguinte -

2020-04-24 00:14:15

Crie um intervalo de tempo

import pandas as pd

print pd.date_range("11:00", "13:30", freq="30min").time

Está output é o seguinte -

[datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0)
datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30)]

Mudar a frequência de tempo

import pandas as pd

print pd.date_range("11:00", "13:30", freq="H").time

Está output é o seguinte -

[datetime.time(11, 0) datetime.time(12, 0) datetime.time(13, 0)]

Convertendo em carimbos de data / hora

Para converter uma série ou um objeto semelhante a uma lista de objetos semelhantes a uma data, por exemplo, strings, épocas ou uma mistura, você pode usar o to_datetimefunção. Quando passado, retorna uma série (com o mesmo índice), enquanto umlist-like é convertido em um DatetimeIndex. Dê uma olhada no seguinte exemplo -

import pandas as pd

print pd.to_datetime(pd.Series(['Jul 31, 2009','2010-01-10', None]))

Está output é o seguinte -

0  2009-07-31
1  2010-01-10
2         NaT
dtype: datetime64[ns]

NaT significa Not a Time (equivalente a NaN)

Vamos dar outro exemplo.

import pandas as pd

print pd.to_datetime(['2005/11/23', '2010.12.31', None])

Está output é o seguinte -

DatetimeIndex(['2005-11-23', '2010-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)

Estendendo as séries temporais, as funcionalidades de data desempenham um papel importante na análise de dados financeiros. Ao trabalhar com dados de data, frequentemente encontramos o seguinte -

  • Gerando sequência de datas
  • Converta a série de datas para diferentes frequências

Crie um intervalo de datas

Usando o date.range()função especificando os períodos e a frequência, podemos criar a série de datas. Por padrão, a frequência do intervalo é Dias.

import pandas as pd

print pd.date_range('1/1/2011', periods=5)

Está output é o seguinte -

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

Mudar a frequência da data

import pandas as pd

print pd.date_range('1/1/2011', periods=5,freq='M')

Está output é o seguinte -

DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30', '2011-05-31'],
   dtype='datetime64[ns]', freq='M')

bdate_range

bdate_range () significa intervalos de datas comerciais. Ao contrário de date_range (), ele exclui sábado e domingo.

import pandas as pd

print pd.date_range('1/1/2011', periods=5)

Está output é o seguinte -

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

Observe, após 3 de março, a data salta para 6 de março excluindo 4 e 5 de março. Basta verificar os dias em seu calendário.

Funções de conveniência como date_range e bdate_rangeutilizar uma variedade de aliases de frequência. A frequência padrão para date_range é um dia de calendário, enquanto o padrão para bdate_range é um dia útil.

import pandas as pd
start = pd.datetime(2011, 1, 1)
end = pd.datetime(2011, 1, 5)

print pd.date_range(start, end)

Está output é o seguinte -

DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
   dtype='datetime64[ns]', freq='D')

Offset Aliases

Vários apelidos de string são fornecidos para frequências de séries temporais comuns úteis. Vamos nos referir a esses aliases como aliases de deslocamento.

Pseudônimo Descrição Pseudônimo Descrição
B frequência do dia útil BQS frequência de início do trimestre comercial
D frequência do dia do calendário UMA frequência final anual (ano)
W frequência semanal BA frequência de fim de ano comercial
M frequência de fim de mês BAS frequência de início do ano comercial
SM frequência de fim de semestre BH frequência do horário comercial
BM frequência de fim de mês útil H frequência horária
em frequência de início do mês T, min frequência minuciosa
SMS Frequência de início semestral de SMS S em segundo lugar, frequência
BMS frequência de início do mês útil L, ms milissegundos
Q frequência de final de trimestre Vc, nos microssegundos
BQ frequência de fim de trimestre comercial N nanossegundos
QS frequência de início do trimestre

Timedeltas são diferenças em tempos, expressos em unidades de diferença, por exemplo, dias, horas, minutos, segundos. Eles podem ser positivos e negativos.

Podemos criar objetos Timedelta usando vários argumentos, conforme mostrado abaixo -

Corda

Ao passar um literal de string, podemos criar um objeto timedelta.

import pandas as pd

print pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')

Está output é o seguinte -

2 days 02:15:30

Inteiro

Ao passar um valor inteiro com a unidade, um argumento cria um objeto Timedelta.

import pandas as pd

print pd.Timedelta(6,unit='h')

Está output é o seguinte -

0 days 06:00:00

Deslocamentos de dados

Deslocamentos de dados como - semanas, dias, horas, minutos, segundos, milissegundos, microssegundos, nanossegundos também podem ser usados ​​na construção.

import pandas as pd

print pd.Timedelta(days=2)

Está output é o seguinte -

2 days 00:00:00

to_timedelta ()

Usando o nível superior pd.to_timedelta, você pode converter um escalar, matriz, lista ou série de um formato / valor timedelta reconhecido em um tipo Timedelta. Ele irá construir uma série se a entrada for uma série, um escalar se a entrada for semelhante a um escalar, caso contrário, irá produzir umTimedeltaIndex.

import pandas as pd

print pd.Timedelta(days=2)

Está output é o seguinte -

2 days 00:00:00

Operações

Você pode operar em Series / DataFrames e construir timedelta64[ns] Série por meio de operações de subtração em datetime64[ns] Série ou carimbos de data / hora.

Vamos agora criar um DataFrame com objetos Timedelta e datetime e realizar algumas operações aritméticas nele -

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))

print df

Está output é o seguinte -

A      B
0  2012-01-01 0 days
1  2012-01-02 1 days
2  2012-01-03 2 days

Operações de adição

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']

print df

Está output é o seguinte -

A      B          C
0 2012-01-01 0 days 2012-01-01
1 2012-01-02 1 days 2012-01-03
2 2012-01-03 2 days 2012-01-05

Operação de Subtração

import pandas as pd

s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']+df['B']

print df

Está output é o seguinte -

A      B          C          D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-04
2 2012-01-03 2 days 2012-01-05 2012-01-07

Freqüentemente, em tempo real, os dados incluem as colunas de texto, que são repetitivas. Recursos como sexo, país e códigos são sempre repetitivos. Estes são os exemplos de dados categóricos.

Variáveis ​​categóricas podem assumir apenas um número limitado e geralmente fixo de valores possíveis. Além do comprimento fixo, os dados categóricos podem ter uma ordem, mas não podem realizar operações numéricas. Categóricos são um tipo de dados Pandas.

O tipo de dados categóricos é útil nos seguintes casos -

  • Uma variável de string que consiste em apenas alguns valores diferentes. A conversão de tal variável de string em uma variável categórica economizará um pouco de memória.

  • A ordem lexical de uma variável não é a mesma que a ordem lógica (“um”, “dois”, “três”). Ao converter para um categórico e especificar uma ordem nas categorias, a classificação e mín / máx usarão a ordem lógica em vez da ordem lexical.

  • Como um sinal para outras bibliotecas Python de que esta coluna deve ser tratada como uma variável categórica (por exemplo, para usar métodos estatísticos adequados ou tipos de gráfico).

Criação de Objetos

Objetos categóricos podem ser criados de várias maneiras. As diferentes formas foram descritas abaixo -

categoria

Especificando o tipo de d como "categoria" na criação do objeto pandas.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print s

Está output é o seguinte -

0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

O número de elementos passados ​​para o objeto da série é quatro, mas as categorias são apenas três. Observe o mesmo nas categorias de saída.

pd.Categorical

Usando o construtor pandas Categorical padrão, podemos criar um objeto de categoria.

pandas.Categorical(values, categories, ordered)

Vamos dar um exemplo -

import pandas as pd

cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat

Está output é o seguinte -

[a, b, c, a, b, c]
Categories (3, object): [a, b, c]

Vamos dar outro exemplo -

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat

Está output é o seguinte -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]

Aqui, o segundo argumento significa as categorias. Assim, qualquer valor que não esteja presente nas categorias será tratado comoNaN.

Agora, dê uma olhada no seguinte exemplo -

import pandas as pd

cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat

Está output é o seguinte -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]

Logicamente, o pedido significa que, a é melhor que b e b é melhor que c.

Descrição

Usando o .describe() comando nos dados categóricos, obtemos uma saída semelhante a um Series ou DataFrame do type corda.

import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})

print df.describe()
print df["cat"].describe()

Está output é o seguinte -

cat s
count    3 3
unique   2 2
top      c c
freq     2 2
count     3
unique    2
top       c
freq      2
Name: cat, dtype: object

Obtenha as propriedades da categoria

obj.cat.categories comando é usado para obter o categories of the object.

import pandas as pd
import numpy as np

s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories

Está output é o seguinte -

Index([u'b', u'a', u'c'], dtype='object')

obj.ordered comando é usado para obter a ordem do objeto.

import pandas as pd
import numpy as np

cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered

Está output é o seguinte -

False

A função retornou false porque não especificamos nenhum pedido.

Renomeando categorias

A renomeação das categorias é feita atribuindo-se novos valores ao series.cat.categoriespropriedade series.cat.categories.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories

Está output é o seguinte -

Index([u'Group a', u'Group b', u'Group c'], dtype='object')

Categorias iniciais [a,b,c] são atualizados pelo s.cat.categories propriedade do objeto.

Anexando novas categorias

Usando o método Categorical.add.categories (), novas categorias podem ser anexadas.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories

Está output é o seguinte -

Index([u'a', u'b', u'c', 4], dtype='object')

Removendo categorias

Usando o Categorical.remove_categories() método, categorias indesejadas podem ser removidas.

import pandas as pd

s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s

print ("After removal:")
print s.cat.remove_categories("a")

Está output é o seguinte -

Original object:
0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

After removal:
0  NaN
1  b
2  c
3  NaN
dtype: category
Categories (2, object): [b, c]

Comparação de dados categóricos

Comparar dados categóricos com outros objetos é possível em três casos -

  • comparar igualdade (== e! =) a um objeto semelhante a uma lista (lista, série, matriz, ...) do mesmo comprimento que os dados categóricos.

  • todas as comparações (==,! =,>,> =, <e <=) de dados categóricos com outra série categórica, quando ordenadas == Verdadeiro e as categorias são as mesmas.

  • todas as comparações de um dado categórico com um escalar.

Dê uma olhada no seguinte exemplo -

import pandas as pd

cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)

print cat>cat1

Está output é o seguinte -

0  False
1  False
2  True
dtype: bool

Plotagem básica: plotagem

Esta funcionalidade em Series e DataFrame é apenas um invólucro simples em torno do matplotlib libraries plot() método.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
   periods=10), columns=list('ABCD'))

df.plot()

Está output é o seguinte -

Se o índice consiste em datas, ele chama gct().autofmt_xdate() para formatar o eixo x conforme mostrado na ilustração acima.

Podemos traçar uma coluna contra outra usando o x e y palavras-chave.

Os métodos de plotagem permitem um punhado de estilos de plotagem além da plotagem de linha padrão. Esses métodos podem ser fornecidos como o argumento de palavra-chave kind paraplot(). Isso inclui -

  • bar ou barh para gráficos de bar
  • hist para histograma
  • caixa para boxplot
  • 'área' para parcelas de área
  • 'scatter' para gráficos de dispersão

Bar Plot

Vamos agora ver o que é um gráfico de barras, criando um. Um gráfico de barra pode ser criado da seguinte maneira -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar()

Está output é o seguinte -

Para produzir um gráfico de barras empilhadas, pass stacked=True -

import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar(stacked=True)

Está output é o seguinte -

Para obter gráficos de barra horizontal, use o barh método -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')

df.plot.barh(stacked=True)

Está output é o seguinte -

Histogramas

Os histogramas podem ser traçados usando o plot.hist()método. Podemos especificar o número de caixas.

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.plot.hist(bins=20)

Está output é o seguinte -

Para traçar histogramas diferentes para cada coluna, use o seguinte código -

import pandas as pd
import numpy as np

df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.diff.hist(bins=20)

Está output é o seguinte -

Box Plots

Boxplot pode ser desenhado chamando Series.box.plot() e DataFrame.box.plot(), ou DataFrame.boxplot() para visualizar a distribuição de valores em cada coluna.

Por exemplo, aqui está um boxplot representando cinco tentativas de 10 observações de uma variável aleatória uniforme em [0,1).

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()

Está output é o seguinte -

Terreno de área

O gráfico de área pode ser criado usando o Series.plot.area() ou o DataFrame.plot.area() métodos.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()

Está output é o seguinte -

Gráfico de dispersão

O gráfico de dispersão pode ser criado usando o DataFrame.plot.scatter() métodos.

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')

Está output é o seguinte -

Gráfico de pizza

O gráfico de pizza pode ser criado usando o DataFrame.plot.pie() método.

import pandas as pd
import numpy as np

df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)

Está output é o seguinte -

o Pandas I/O API é um conjunto de funções de leitor de nível superior acessadas como pd.read_csv() que geralmente retornam um objeto Pandas.

As duas funções burras para ler arquivos de texto (ou arquivos simples) são read_csv() e read_table(). Ambos usam o mesmo código de análise para converter dados tabulares em umDataFrame objeto -

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None

pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None

Aqui está como csv os dados do arquivo parecem -

S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900

Salve esses dados como temp.csv e realizar operações nele.

S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900

Salve esses dados como temp.csv e realizar operações nele.

read.csv

read.csv lê os dados dos arquivos csv e cria um objeto DataFrame.

import pandas as pd

df=pd.read_csv("temp.csv")
print df

Está output é o seguinte -

S.No     Name   Age       City   Salary
0     1      Tom    28    Toronto    20000
1     2      Lee    32   HongKong     3000
2     3   Steven    43   Bay Area     8300
3     4      Ram    38  Hyderabad     3900

índice personalizado

Isso especifica uma coluna no arquivo csv para personalizar o índice usando index_col.

import pandas as pd

df=pd.read_csv("temp.csv",index_col=['S.No'])
print df

Está output é o seguinte -

S.No   Name   Age       City   Salary
1       Tom    28    Toronto    20000
2       Lee    32   HongKong     3000
3    Steven    43   Bay Area     8300
4       Ram    38  Hyderabad     3900

Conversores

dtype das colunas pode ser passado como um dicionário.

import pandas as pd

df = pd.read_csv("temp.csv", dtype={'Salary': np.float64})
print df.dtypes

Está output é o seguinte -

S.No       int64
Name      object
Age        int64
City      object
Salary   float64
dtype: object

Por padrão, o dtype da coluna Salário é int, mas o resultado mostra como float porque definimos explicitamente o tipo.

Assim, os dados parecem flutuantes -

S.No   Name   Age      City    Salary
0   1     Tom   28    Toronto   20000.0
1   2     Lee   32   HongKong    3000.0
2   3  Steven   43   Bay Area    8300.0
3   4     Ram   38  Hyderabad    3900.0

header_names

Especifique os nomes do cabeçalho usando o argumento names.

import pandas as pd
 
df=pd.read_csv("temp.csv", names=['a', 'b', 'c','d','e'])
print df

Está output é o seguinte -

a        b    c           d        e
0   S.No     Name   Age       City   Salary
1      1      Tom   28     Toronto    20000
2      2      Lee   32    HongKong     3000
3      3   Steven   43    Bay Area     8300
4      4      Ram   38   Hyderabad     3900

Observe que os nomes dos cabeçalhos são anexados aos nomes personalizados, mas o cabeçalho do arquivo não foi eliminado. Agora, usamos o argumento do cabeçalho para removê-lo.

Se o cabeçalho estiver em uma linha diferente da primeira, passe o número da linha para o cabeçalho. Isso irá ignorar as linhas anteriores.

import pandas as pd 

df=pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0)
print df

Está output é o seguinte -

a        b    c           d        e
0  S.No     Name   Age       City   Salary
1     1      Tom   28     Toronto    20000
2     2      Lee   32    HongKong     3000
3     3   Steven   43    Bay Area     8300
4     4      Ram   38   Hyderabad     3900

skiprows

skiprows pula o número de linhas especificado.

import pandas as pd

df=pd.read_csv("temp.csv", skiprows=2)
print df

Está output é o seguinte -

2      Lee   32    HongKong   3000
0   3   Steven   43    Bay Area   8300
1   4      Ram   38   Hyderabad   3900

Objetos esparsos são “comprimidos” quando qualquer dado correspondente a um valor específico (NaN / valor ausente, embora qualquer valor possa ser escolhido) é omitido. Um objeto especial SparseIndex rastreia onde os dados foram “esparsos”. Isso fará muito mais sentido em um exemplo. Todas as estruturas de dados padrão do Pandas aplicam oto_sparse método -

import pandas as pd
import numpy as np

ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts

Está output é o seguinte -

0   -0.810497
1   -1.419954
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8    0.439240
9   -1.095910
dtype: float64
BlockIndex
Block locations: array([0, 8], dtype=int32)
Block lengths: array([2, 2], dtype=int32)

Os objetos esparsos existem por motivos de eficiência de memória.

Vamos agora supor que você tenha um grande DataFrame de NA e execute o seguinte código -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10000, 4))
df.ix[:9998] = np.nan
sdf = df.to_sparse()

print sdf.density

Está output é o seguinte -

0.0001

Qualquer objeto esparso pode ser convertido de volta para a forma densa padrão chamando to_dense -

import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts.to_dense()

Está output é o seguinte -

0   -0.810497
1   -1.419954
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8    0.439240
9   -1.095910
dtype: float64

Dtipos esparsos

Dados esparsos devem ter o mesmo tipo de d que sua representação densa. Atualmente,float64, int64 e booldtypessão suportados. Dependendo do originaldtype, fill_value default mudanças -

  • float64 - np.nan

  • int64 - 0

  • bool - Falso

Vamos executar o seguinte código para entender o mesmo -

import pandas as pd
import numpy as np

s = pd.Series([1, np.nan, np.nan])
print s

s.to_sparse()
print s

Está output é o seguinte -

0   1.0
1   NaN
2   NaN
dtype: float64

0   1.0
1   NaN
2   NaN
dtype: float64

Advertências significa aviso e pegadinha significa um problema invisível.

Usando a declaração If / Truth com os Pandas

O Pandas segue a convenção entorpecida de gerar um erro quando você tenta converter algo em um bool. Isso acontece em umif ou when usando as operações booleanas, e, or, ou not. Não está claro qual deve ser o resultado. Deve ser verdadeiro porque não é comprimento zero? False porque existem valores False? Não está claro, então, em vez disso, o Pandas levanta umValueError -

import pandas as pd

if pd.Series([False, True, False]):
   print 'I am True'

Está output é o seguinte -

ValueError: The truth value of a Series is ambiguous. 
Use a.empty, a.bool() a.item(),a.any() or a.all().

Dentro ifcondição, não está claro o que fazer com ele. O erro sugere se deve ser usado umNone ou any of those.

import pandas as pd

if pd.Series([False, True, False]).any():
   print("I am any")

Está output é o seguinte -

I am any

Para avaliar objetos pandas de elemento único em um contexto booleano, use o método .bool() -

import pandas as pd

print pd.Series([True]).bool()

Está output é o seguinte -

True

Booleano bit a bit

Operadores booleanos bit a bit como == e != retornará uma série booleana, que quase sempre é o que é necessário de qualquer maneira.

import pandas as pd

s = pd.Series(range(5))
print s==4

Está output é o seguinte -

0 False
1 False
2 False
3 False
4 True
dtype: bool

está em operação

Isso retorna uma série booleana mostrando se cada elemento na série está contido exatamente na sequência de valores passada.

import pandas as pd

s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s

Está output é o seguinte -

0 True
1 False
2 True
dtype: bool

Reindexando vs ix Gotcha

Muitos usuários se verão usando o ix indexing capabilities como um meio conciso de selecionar dados de um objeto Pandas -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[['b', 'c', 'e']]

Está output é o seguinte -

one        two      three       four
a   -1.582025   1.335773   0.961417  -1.272084
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
d   -2.380648  -0.029981   0.196489   0.531714
e    1.846746   0.148149   0.275398  -0.244559
f   -1.842662  -0.933195   2.303949   0.677641

          one        two      three       four
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
e    1.846746   0.148149   0.275398  -0.244559

Isso é, obviamente, completamente equivalente, neste caso, a usar o reindex método -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.reindex(['b', 'c', 'e'])

Está output é o seguinte -

one        two      three       four
a    1.639081   1.369838   0.261287  -1.662003
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
d   -1.078791  -0.612607  -0.897289  -1.146893
e    0.465215   1.552873  -1.841959   0.329404
f    0.966022  -0.190077   1.324247   0.678064

          one        two      three       four
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
e    0.465215   1.552873  -1.841959   0.329404

Alguns podem concluir que ix e reindexsão 100% equivalentes com base nisso. Isso é verdade, exceto no caso de indexação de inteiros. Por exemplo, a operação acima pode alternativamente ser expressa como -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])

Está output é o seguinte -

one        two      three       four
a   -1.015695  -0.553847   1.106235  -0.784460
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
d   -1.238016  -0.749554  -0.547470  -0.029045
e   -0.056788   1.063999  -0.767220   0.212476
f    1.139714   0.036159   0.201912   0.710119

          one        two      three       four
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
e   -0.056788   1.063999  -0.767220   0.212476

    one  two  three  four
1   NaN  NaN    NaN   NaN
2   NaN  NaN    NaN   NaN
4   NaN  NaN    NaN   NaN

É importante lembrar que reindex is strict label indexing only. Isso pode levar a alguns resultados potencialmente surpreendentes em casos patológicos em que um índice contém, digamos, inteiros e strings.

Visto que muitos usuários potenciais do Pandas têm alguma familiaridade com SQL, esta página tem como objetivo fornecer alguns exemplos de como várias operações SQL podem ser realizadas usando o pandas.

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips.head()

Está output é o seguinte -

total_bill   tip      sex  smoker  day     time  size
0        16.99  1.01   Female      No  Sun  Dinner      2
1        10.34  1.66     Male      No  Sun  Dinner      3
2        21.01  3.50     Male      No  Sun  Dinner      3
3        23.68  3.31     Male      No  Sun  Dinner      2
4        24.59  3.61   Female      No  Sun  Dinner      4

SELECIONE

No SQL, a seleção é feita usando uma lista separada por vírgulas de colunas que você seleciona (ou um * para selecionar todas as colunas) -

SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;

Com o Pandas, a seleção de colunas é feita passando uma lista de nomes de colunas para seu DataFrame -

tips[['total_bill', 'tip', 'smoker', 'time']].head(5)

Vamos verificar o programa completo -

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
 
tips=pd.read_csv(url)
print tips[['total_bill', 'tip', 'smoker', 'time']].head(5)

Está output é o seguinte -

total_bill   tip  smoker     time
0       16.99  1.01      No   Dinner
1       10.34  1.66      No   Dinner
2       21.01  3.50      No   Dinner
3       23.68  3.31      No   Dinner
4       24.59  3.61      No   Dinner

Chamar o DataFrame sem a lista de nomes de coluna exibirá todas as colunas (semelhante a * do SQL).

ONDE

A filtragem em SQL é feita por meio de uma cláusula WHERE.

SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;

Os DataFrames podem ser filtrados de várias maneiras; o mais intuitivo deles é usar a indexação booleana.

tips[tips['time'] == 'Dinner'].head(5)

Vamos verificar o programa completo -

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips[tips['time'] == 'Dinner'].head(5)

Está output é o seguinte -

total_bill   tip      sex  smoker  day    time  size
0       16.99  1.01   Female     No   Sun  Dinner    2
1       10.34  1.66     Male     No   Sun  Dinner    3
2       21.01  3.50     Male     No   Sun  Dinner    3
3       23.68  3.31     Male     No   Sun  Dinner    2
4       24.59  3.61   Female     No   Sun  Dinner    4

A instrução acima passa uma série de objetos True / False para o DataFrame, retornando todas as linhas com True.

GroupBy

Esta operação busca a contagem de registros em cada grupo em um conjunto de dados. Por exemplo, uma consulta que nos busca o número de dicas deixadas por sexo -

SELECT sex, count(*)
FROM tips
GROUP BY sex;

O equivalente Pandas seria -

tips.groupby('sex').size()

Vamos verificar o programa completo -

import pandas as pd

url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
print tips.groupby('sex').size()

Está output é o seguinte -

sex
Female   87
Male    157
dtype: int64

N principais linhas

SQL retorna o top n rows usando LIMIT -

SELECT * FROM tips
LIMIT 5 ;

O equivalente Pandas seria -

tips.head(5)

Vamos verificar o exemplo completo -

import pandas as pd

url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'

tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print tips

Está output é o seguinte -

smoker   day     time
0      No   Sun   Dinner
1      No   Sun   Dinner
2      No   Sun   Dinner
3      No   Sun   Dinner
4      No   Sun   Dinner

Estas são as poucas operações básicas que comparamos e que aprendemos nos capítulos anteriores da Biblioteca Pandas.