Pandas - reindex

reindex() Fonksiyonu

reindex() fonksiyonu, Pandas'ta temel veri sıralama (hizalama) yöntemlerinden biridir. Bir veri çerçevesinin satır ya da sütunlarını yeniden sıralamak için kullanılan en yaygın yöntemdir. Prensip olarak, etiket sıralama mantığına dayanır. Bu işlem, indeks değerlerini ya da sütun isimlerini yeniden sıralamak ve verileri belirli bir eksen (Satır ya da sütun) boyunca belirli bir etiket kümesiyle eşleşecek şekilde uyarlamak anlamına gelir. Bu fonksiyon, hem seçim hem de sıralama mantığıyla çalışır. Bu yöntemle şunlar sağlanır ;

Fonksiyonu ve parametrelerini bir örnekle inceleyelim. df veri çerçevemizin ilk 15 verisine göz atalım.

import pandas as pd
df = pd.read_excel("Veri_Setleri/imdb.xlsx", index_col="Film_Adı")
print(df.head(15))
Film_Adı Yıl Puan Oylayan_Kişi
The Shawshank Redemption 1994 9,2 1071904
The Godfather 1972 9,2 751381
The Godfather: Part II 1974 9 488889
Pulp Fiction 1994 8,9 830504
The Dark Knight 2008 8,9 1045186
12 Angry Men 1957 8,9 264112
Schindler's List 1993 8,9 545703
The Lord of the Rings: The Return of the King 2003 8,8 758388
Fight Club 1999 8,8 814389
Star Wars: Episode V - The Empire Strikes Back 1980 8,8 519895
The Lord of the Rings: The Fellowship of the Ring 2001 8,8 784999
One Flew Over the Cuckoo's Nest 1975 8,7 447005
Goodfellas 1990 8,7 465445
Seven Samurai 1954 8,7 161969
Inception 2010 8,7 844938

Hem seçim hem de sıralama mantığı ile çalışan bu fonksiyon ile Fight Club, Pulp Fiction, Inception, The Godfather, The Dark Knight ve Seven Samurai filmlerini, yazdığımız sıra ile sirala_filtrele isimli yeni bir Veri Çerçevesine atayalım.

sirala_filtrele = df.reindex(["Fight Club ", "Pulp Fiction", "Inception", "The Godfather ", "The Dark Knight ", "Seven Samurai "])
print(sirala_filtrele)
Film_Adı Yıl Puan Oylayan_Kişi
Fight Club 1999 8,8 814389
Pulp Fiction 1994 8,9 830504
Inception 2010 8,7 844938
The Godfather 1972 9,2 751381
The Dark Knight 2008 8,9 1045186
Seven Samurai 1954 8,7 161969

df veri çerçevemizde bulunmayan (eksik/kayıp veri) bir filmi sirala_filtrele veri çerçevemize eklemeye çalışırak ne olacağını görelim.

sirala_filtrele = df.reindex(["Deli Yürek", "Fight Club ", "Pulp Fiction",
                              "Inception", "The Godfather ", 
                              "The Dark Knight ", "Seven Samurai "])
print(sirala_filtrele)
Film_Adı Yıl Puan Oylayan_Kişi
Deli Yürek NaN NaN NaN
Fight Club 1999.0 8,8 814389.0
Pulp Fiction 1994.0 8,9 830504.0
Inception 2010.0 8,7 844938.0
The Godfather 1972.0 9,2 751381.0
The Dark Knight 2008.0 8,9 1045186.0
Seven Samurai 1954.0 8,7 161969.0

Gördüğünüz gibi, df veri çerçevemizde Deli Yürek isimli bir filmi bulunmadığı için, sirala_filtrele veri çerçevemize sadece Filmin Adı eklendi, Yıl, Puan ve Oylayan_Kişi bilgileri yerine NaN değeri atandı.

Parametreler

columns Parametresi

df veri çerçevemizin sütun isimleri Yıl, Puan ve Oylayan_Kişi sırası ile görüntüleniyor. Bu sırayı reindex() fonksiyonu yardımı ile değiştirmek istersek, columns parametresini kullanabiliriz. sirala_filtrele isimli veri çerçevemizin sütunlarını Puan, Yıl, Oylayan_Kişi sırasına göre hizalamaya çalışalım.

print(sirala_filtrele.reindex(columns=["Puan", "Yıl", "Oylayan_Kişi"]))
Film_Adı Puan Yıl Oylayan_Kişi
Deli Yürek NaN NaN NaN
Fight Club 8,8 1999.0 814389.0
Pulp Fiction 8,9 1994.0 830504.0
Inception 8,7 2010.0 844938.0
The Godfather 9,2 1972.0 751381.0
The Dark Knight 8,9 2008.0 1045186.0
Seven Samurai 8,7 1954.0 161969.0

index parametresi

reindex() fonksiyonunu, Dilimleme ve Filtreleme işlemi olarak ta kullanabiliriz. df veri çerçevemizdeki Seven Samurai, Fight Club ve Inception isimli filmlere ait sadece Yıl ve Puan bilgilerini elde etmek istersek reindex() fonksiyonu ile birlikte index ve columns parametrelerini kullanmalıyız.

print(df.reindex(index=["Seven Samurai ", "Fight Club ", "Inception"], 
                 columns=["Yıl", "Puan"]))
Film_Adı Yıl Puan
Seven Samurai 1954 8,7
Fight Club 1999 8,8
Inception 2010 8,7

axis parametresi

Veri çerçevenizin indeks değerlerini (satırlar) ya da sütun isimlerini/değerlerini reindex() fonksiyonun, axis parametresi ile de sıralayabilirsiniz.

İndeks değerleri ve Sütun isimleri 0, 1 ve 2 olan bir veri çerçevesi oluşturup göz atalım.

bir = [1,2,3], [40,50,60], [700,800,900]
sutun = [0,1,2]

df_1 = pd.DataFrame(bir, columns=sutun)
print(df_1)
0 1 2
0 1 2 3
1 40 50 60
2 700 800 900

index Seçeneği

İndeks değerlerini 2, 1 ve 0 olacak şekilde (büyükten küçüğe doğru) sıralamak için axis="index" parametre seçeneğini kullanmalıyız.

print(df_1.reindex([2,1,0], axis="index"))
0 1 2
2 700 800 900
1 40 50 60
0 1 2 3

columns Seçeneği

sütun değerlerini 2, 1 ve 0 olacak şekilde (büyükten küçüğe doğru) sıralamak için axis="columns" parametre seçeneğini kullanmalıyız.

print(df_1.reindex([2,1,0], axis="columns"))
2 1 0
0 3 2 1
1 60 50 40
2 900 800 700

Ek Bilgi :

reindex() fonksiyonunu kullanırken, gerçek eksen etiketlerini (indeksleri) içeren index nesnelerinin, nesneler arasında paylaşılabileceğine dikkat edin!

Yani bir Seriniz (Series) ve Veri Çerçeveniz (Data Frame) varsa, bunların indeks değerlerini reindex() fonksiyonunda parametre olarak kullanabilirsiniz.

iki = ["a","b","c"], ["aa","bb","cc"], ["aaa","bbb","ccc"]
sutun = [1,2,0]

df_2 = pd.DataFrame(iki, index=sutun, columns=sutun)
print(df_2)
1 2 0
1 a b c
2 aa bb cc
0 aaa bbb ccc

df_2 veri çerçevesinde index ve Sütun isimleri 1,2,0 olarak atanmış. df_1 veri çerçevesinde index ve Sütun isimleri ise 0,1,2 olarak atanmış.

df_2'nin indeks değerlerini (satır etiketini) reindex() fonksiyonu ile değiştirirken, yeni sıralamayı df_1'in indeks değerleri ile belirleyelim/eşleştirelim.

print(df_2.reindex(df_1.index))
1 2 0
0 aaa bbb ccc
1 a b c
2 aa bb cc

df_2'nin Sütun isimlerini reindex() fonksiyonun columns parametresi ile değiştirirken, yeni sıralamayı df_1'in indeks değerleri ile belirleyelim/eşleştirelim.

print(df_2.reindex(columns=df_1.index))
0 1 2
1 c a b
2 cc aa bb
0 ccc aaa bbb