In [1]:
import numpy as np
import pandas as pd
In [2]:
obj = pd.Series([4.5,7.2,-5.3,3.6], index=['d','b','a','c'])
obj
Out[2]:
Series reorganizam os dados de acordo com o novo índice, introduzindo um valor vazio no caso de algum valor ausente.
In [3]:
obj2 = obj.reindex(['a','b','c','d','e'])
obj2
Out[3]:
In [4]:
obj.reindex(['a','b','c','d','e'], fill_value=0)
Out[4]:
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
In [5]:
frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])
frame
Out[5]:
In [6]:
frame2 = frame.reindex(['a','b','c','d'])
frame2
Out[6]:
As colunas podem ser reindexadas utilizando o parâmetro columns
In [7]:
states = ['Texas', 'Utah', 'California']
frame.reindex(columns=states)
Out[7]:
Ambos podem ser reindexados de uma só vez
In [8]:
frame.reindex(index=['a','b','c','d'], columns=states)
Out[8]:
In [9]:
obj = pd.Series(np.arange(5.), index=['a','b','c','d','e'])
obj
Out[9]:
In [10]:
obj.drop('c')
Out[10]:
In [11]:
obj.drop(['d','c'])
Out[11]:
Com DataFrame, os valores de índice podem ser deletados de ambos os eixos
In [12]:
data = pd.DataFrame(np.arange(16).reshape((4, 4)), \
index=['Ohio', 'Colorado', 'Utah', 'New York'], \
columns=['one', 'two', 'three', 'four'])
data
Out[12]:
In [13]:
data.drop(['Colorado', 'Ohio'])
Out[13]:
In [14]:
data.drop('two', axis=1)
Out[14]:
In [15]:
data.drop(['two','four'], axis=1)
Out[15]:
In [16]:
obj = pd.Series(np.arange(4.), index=['a','b','c','d'])
obj
Out[16]:
Segue alguns exemplos de formas de acessar os elemento em uma Series
In [17]:
# pelo nome do índice
obj['b']
Out[17]:
In [18]:
# pela posição no vetor de valores
obj[1]
Out[18]:
In [19]:
# por um intervalo
obj[2:4]
Out[19]:
In [20]:
# através de uma lista de nomes
obj[['b','a','d']]
Out[20]:
In [21]:
# através de uma lista de posições
obj[[1,3]]
Out[21]:
In [22]:
# através de uma operação booleana
obj[obj < 2]
Out[22]:
Ao fazer essa indexação em um DataFrame recuperamos uma ou mais colunas.
In [23]:
data = pd.DataFrame(np.arange(16).reshape((4, 4)), \
index=['Ohio', 'Colorado', 'Utah', 'New York'], \
columns=['one', 'two', 'three', 'four'])
data
Out[23]:
Segue algumas formas de acessar e modificar os elementos de um DataFrame
In [24]:
data['two']
Out[24]:
In [25]:
data[['three','one']]
Out[25]:
In [26]:
data[:2]
Out[26]:
In [27]:
data[data['three'] > 5]
Out[27]:
In [28]:
data < 5
Out[28]:
In [29]:
data[data < 5] = 0
data
Out[29]:
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. |
In [30]:
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
In [31]:
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
In [32]:
s1
Out[32]:
In [33]:
s2
Out[33]:
Quando uma das Series não possui valor em um índice, no resultado é atribuído um resultado vazio naquele índice.
In [34]:
s1 + s2
Out[34]:
No caso dos DataFrame, o alinhamento é feito nas linhas e colunas ao mesmo tempo.
In [35]:
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'])
In [36]:
df1
Out[36]:
In [37]:
df2
Out[37]:
In [38]:
df1 + df2
Out[38]:
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.
In [39]:
df1.add(df2, fill_value=0)
Out[39]:
Também é possível fazer operações aritméticas entre DataFrames e Series.
In [40]:
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [41]:
series = frame.ix[0]
In [42]:
frame
Out[42]:
In [43]:
series
Out[43]:
In [44]:
frame - series
Out[44]:
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
In [45]:
series2 = pd.Series(range(3), index=['b', 'e', 'f'])
frame + series2
Out[45]:
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
In [46]:
series3 = frame['d']
frame.sub(series3, axis=0)
Out[46]:
As funções de vetor do numpy funcionam bem com objetos do pandas
In [47]:
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
Out[47]:
In [48]:
np.abs(frame)
Out[48]:
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.
In [49]:
f = lambda x: x.max() - x.min()
In [50]:
frame.apply(f)
Out[50]:
In [51]:
frame.apply(f, axis=1)
Out[51]:
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
In [52]:
format = lambda x: '%.2f' % x
In [53]:
frame.applymap(format)
Out[53]:
In [54]:
frame['e'].map(format)
Out[54]: