Python Pandas - reindeksowanie
Reindexingzmienia etykiety wierszy i kolumn DataFrame. Aby reindex środki do zgodnych danych dopasować dany zestaw etykiet wzdłuż określonej osi.
Wiele operacji można wykonać poprzez indeksowanie, takie jak -
Zmień kolejność istniejących danych, aby dopasować je do nowego zestawu etykiet.
Wstaw znaczniki brakujących wartości (NA) w lokalizacjach etykiet, w których nie było danych dla etykiety.
Przykład
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
Jego output wygląda następująco -
A C B
0 2016-01-01 Low NaN
2 2016-01-03 High NaN
5 2016-01-06 Low NaN
Zindeksuj ponownie, aby wyrównać z innymi obiektami
Możesz chcieć wziąć obiekt i ponownie zindeksować jego osie, aby uzyskać taką samą etykietę jak inny obiekt. Rozważ następujący przykład, aby zrozumieć to samo.
Przykład
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
Jego output wygląda następująco -
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 - Tutaj df1 DataFrame jest zmieniana i reindeksowana jak df2. Nazwy kolumn powinny być dopasowane, w przeciwnym razie NAN zostanie dodany do całej etykiety kolumny.
Wypełnianie podczas ponownego indeksowania
reindex() przyjmuje opcjonalną metodę parametru, która jest metodą wypełniania z następującymi wartościami -
pad/ffill - Wypełnij wartości do przodu
bfill/backfill - Wypełnij wartości wstecz
nearest - Wypełnij od najbliższych wartości indeksu
Przykład
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')
Jego output wygląda następująco -
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 - Ostatnie cztery rzędy są wyściełane.
Ograniczenia dotyczące wypełniania podczas ponownego indeksowania
Argument limit zapewnia dodatkową kontrolę nad wypełnianiem podczas ponownego indeksowania. Limit określa maksymalną liczbę kolejnych dopasowań. Rozważmy następujący przykład, aby zrozumieć to samo -
Przykład
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)
Jego output wygląda następująco -
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- Zauważ, że tylko siódmy wiersz jest wypełniony przez poprzedni szósty wiersz. Następnie rzędy pozostawia się bez zmian.
Zmiana nazwy
Metoda rename () umożliwia zmianę etykiety osi na podstawie jakiegoś odwzorowania (dykt lub seria) lub dowolnej funkcji.
Rozważmy następujący przykład, aby to zrozumieć -
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'})
Jego output wygląda następująco -
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
Metoda rename () zapewnia rozszerzenie inplacenazwany parametr, który domyślnie ma wartość False i kopiuje podstawowe dane. Przechodzićinplace=True aby zmienić nazwę danych w miejscu.