Python Pandas - reindexação
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 os 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.