<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Pandas
Funções Importantes
Importando o Pandas e o NumPy
Step1:  Reindexação
Step2:  Series reorganizam os dados de acordo com o novo índice, introduzindo um valor vazio no caso de algum valor ausente.
Step3:  Com um DataFrame, o método reindex pode alterar o index (linhas) as colunas ou ambos. Quando passado apenas uma sequência, as linhas são reindexadas
Step4:  As colunas podem ser reindexadas utilizando o parâmetro columns
Step5:  Ambos podem ser reindexados de uma só vez
Step6:  Deletando entradas de um eixo
Step7:  Com DataFrame, os valores de índice podem ser deletados de ambos os eixos
Step8:  Indexando, selecioando e filtrando
Step9:  Segue alguns exemplos de formas de acessar os elemento em uma Series
Step10:  Ao fazer essa indexação em um DataFrame recuperamos uma ou mais colunas.
Step11:  Segue algumas formas de acessar e modificar os elementos de um DataFrame
Step12:  Na seguinte tabela é possível ver outras madeiras de fazer essas operações de indexação
Type | Notes
Step13:  Quando uma das Series não possui valor em um índice, no resultado é atribuído um resultado vazio naquele índice.
Step14:  No caso dos DataFrame, o alinhamento é feito nas linhas e colunas ao mesmo tempo.
Step15:  Para evitar que esses valores vazios sejam atribuídos é possível subtituir um valor não existente em uma das Series ou DataFrames por um certo valor padrão.
Step16:  Também é possível fazer operações aritméticas entre DataFrames e Series.
Step17:  Se um valor não for encontrado nas colunas do DataFrame ou no índice da Series, o  resultado vai ser reindexado para formar a união dos dois
Step18:  Se você quer realizar a operação com a Series pelas colunas ao invés de pelas linhas é necessário utilizar um dos métodos aritméticos
Step19:  Aplicação de funções e mapeamento
As funções de vetor do numpy funcionam bem com objetos do pandas
Step20:  Outra operação frequente é aplicar uma função de um vetor unidimensional para cada coluna ou linha do DataFrame. O método apply faz exatamente isso.
Step21:  Também é possível usar funções sobre elementos (ao invés de sobre vetores). Para isso você pode usar applymap quando estiver usando um DataFrame ou map quando estiver usando uma Series
<ASSISTANT_TASK:>
Python Code:
import numpy as np
import pandas as pd
Explanation: Pandas
Funções Importantes
Importando o Pandas e o NumPy
End of explanation
obj = pd.Series([4.5,7.2,-5.3,3.6], index=['d','b','a','c'])
obj
Explanation: Reindexação
End of explanation
obj2 = obj.reindex(['a','b','c','d','e'])
obj2
obj.reindex(['a','b','c','d','e'], fill_value=0)
Explanation: Series reorganizam os dados de acordo com o novo índice, introduzindo um valor vazio no caso de algum valor ausente.
End of explanation
frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])
frame
frame2 = frame.reindex(['a','b','c','d'])
frame2
Explanation: Com um DataFrame, o método reindex pode alterar o index (linhas) as colunas ou ambos. Quando passado apenas uma sequência, as linhas são reindexadas
End of explanation
states = ['Texas', 'Utah', 'California']
frame.reindex(columns=states)
Explanation: As colunas podem ser reindexadas utilizando o parâmetro columns
End of explanation
frame.reindex(index=['a','b','c','d'], columns=states)
Explanation: Ambos podem ser reindexados de uma só vez
End of explanation
obj = pd.Series(np.arange(5.), index=['a','b','c','d','e'])
obj
obj.drop('c')
obj.drop(['d','c'])
Explanation: Deletando entradas de um eixo
End of explanation
data = pd.DataFrame(np.arange(16).reshape((4, 4)), \
                    index=['Ohio', 'Colorado', 'Utah', 'New York'], \
                    columns=['one', 'two', 'three', 'four'])
data
data.drop(['Colorado', 'Ohio'])
data.drop('two', axis=1)
data.drop(['two','four'], axis=1)
Explanation: Com DataFrame, os valores de índice podem ser deletados de ambos os eixos
End of explanation
obj = pd.Series(np.arange(4.), index=['a','b','c','d'])
obj
Explanation: Indexando, selecioando e filtrando
End of explanation
# pelo nome do índice
obj['b']
# pela posição no vetor de valores
obj[1]
# por um intervalo
obj[2:4]
# através de uma lista de nomes
obj[['b','a','d']]
# através de uma lista de posições
obj[[1,3]]
# através de uma operação booleana
obj[obj < 2]
Explanation: Segue alguns exemplos de formas de acessar os elemento em uma Series
End of explanation
data = pd.DataFrame(np.arange(16).reshape((4, 4)), \
                    index=['Ohio', 'Colorado', 'Utah', 'New York'], \
                    columns=['one', 'two', 'three', 'four'])
data
Explanation: Ao fazer essa indexação em um DataFrame recuperamos uma ou mais colunas.
End of explanation
data['two']
data[['three','one']]
data[:2]
data[data['three'] > 5]
data < 5
data[data < 5] = 0
data
Explanation: Segue algumas formas de acessar e modificar os elementos de um DataFrame
End of explanation
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
s1
s2
Explanation: Na seguinte tabela é possível ver outras madeiras de fazer essas operações de indexação
Type | Notes
:-----|:------
obj[val] | Select single column or sequence of columns from the DataFrame. Special case conveniences: boolean array (filter rows), slice (slice rows), or boolean DataFrame (set values based on some criterion).
obj.ix[val] | Selects single row of subset of rows from the DataFrame.
obj.ix[:, val] | Selects single column of subset of columns.
obj.ix[val1, val2] | Select both rows and columns.
reindex method | Conform one or more axes to new indexes.
xs method | Select single row or column as a Series by label.
icol, irow methods | Select single column or row, respectively, as a Series by integer location.
get_value, set_value methods | Select single value by row and column label.
Aritimética e alinhamento de dados
End of explanation
s1 + s2
Explanation: Quando uma das Series não possui valor em um índice, no resultado é atribuído um resultado vazio naquele índice.
End of explanation
df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'), index=['Ohio', 'Texas', 'Colorado'])
df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
df1
df2
df1 + df2
Explanation: No caso dos DataFrame, o alinhamento é feito nas linhas e colunas ao mesmo tempo.
End of explanation
df1.add(df2, fill_value=0)
Explanation: Para evitar que esses valores vazios sejam atribuídos é possível subtituir um valor não existente em uma das Series ou DataFrames por um certo valor padrão.
End of explanation
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.ix[0]
frame
series
frame - series
Explanation: Também é possível fazer operações aritméticas entre DataFrames e Series.
End of explanation
series2 = pd.Series(range(3), index=['b', 'e', 'f'])
frame + series2
Explanation: Se um valor não for encontrado nas colunas do DataFrame ou no índice da Series, o  resultado vai ser reindexado para formar a união dos dois
End of explanation
series3 = frame['d']
frame.sub(series3, axis=0)
Explanation: Se você quer realizar a operação com a Series pelas colunas ao invés de pelas linhas é necessário utilizar um dos métodos aritméticos
End of explanation
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
np.abs(frame)
Explanation: Aplicação de funções e mapeamento
As funções de vetor do numpy funcionam bem com objetos do pandas
End of explanation
f = lambda x: x.max() - x.min()
frame.apply(f)
frame.apply(f, axis=1)
Explanation: Outra operação frequente é aplicar uma função de um vetor unidimensional para cada coluna ou linha do DataFrame. O método apply faz exatamente isso.
End of explanation
format = lambda x: '%.2f' % x
frame.applymap(format)
frame['e'].map(format)
Explanation: Também é possível usar funções sobre elementos (ao invés de sobre vetores). Para isso você pode usar applymap quando estiver usando um DataFrame ou map quando estiver usando uma Series
End of explanation
<END_TASK>