Pandas - merge

merge() Fonksiyonu

merge() fonksiyonu join() fonksiyonuna benzer ancak bazı farklı özellikleri vardır. Veri Çerçevesi (DataFrame) veya adlandırılmış Seri nesnelerini (Series) veritabanı stili birleştirme yöntemi ile (SQL’de bulunan inner join, outer join … ‘e benzer) birleştirmek için merge() fonksiyonunu kullanılabilir.
Adlandırılmış Seri nesnesi (Series), adlandırılmış tek bir sütuna sahip Veri çerçevesi (DataFrame) olarak ele alınır.
merge() fonksiyonunun bir çok parametresi vardır. Biz burada temel bir kaç parametreye değineceğiz.

DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, 
            left_index=False, right_index=False, sort=False, 
            suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

Parametreler

on Parametresi

on parametresi, Veri Çerçevelerinin hangi sütun baz alınarak birleştirileceğini belirteceğimiz parametredir. Öğrenci isimleri ile Vize ve Final sonuçlarının bulunduğu iki veri çerçevesi oluşturup, parametrelerin kullanımını görelim.

import pandas as pd
vize = pd.DataFrame({"Ogrenci": ["ali", "busra", "ceyhun", "eda", "gamze", "kamil"], 
                     "Sinav Sonucu": [41, 58, 73, 81, 95, 85]})

final = pd.DataFrame({"Ogrenci": ["ali", "busra", "derya", "fatih", "halil"], 
                      "Sinav Sonucu": [60, 68, 74, 90, 95]})
print(vize)
Ogrenci Sinav Sonucu
0 ali 41
1 busra 58
2 ceyhun 73
3 eda 81
4 gamze 95
5 kamil 85
print(final)
Ogrenci Sinav Sonucu
0 ali 60
1 busra 68
2 derya 74
3 fatih 90
4 halil 95

Yukarıdaki iki veri çerçevesini, Ogrenci isimli sütunu temel alarak birleştirlim. how parametresine şuan takılmayın, aşağıda detaylıca anlatılıyor.

tumu = pd.merge(vize, final, on = "Ogrenci", how = "outer")
print(tumu)
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41.0 60.0
1 busra 58.0 68.0
2 ceyhun 73.0 NaN
3 eda 81.0 NaN
4 gamze 95.0 NaN
5 kamil 85.0 NaN
6 derya NaN 74.0
7 fatih NaN 90.0
8 halil NaN 95.0

Birleştirme işlemi sonucunda, İki veri çerçevesindeki tüm veriler, yeni veri çerçevesinde birleştirildi. Hem Vize hemde Final veri çerçevelerinde isimleri bulunan öğrencilerin sınav sonuçları yeni veri çerçevesinde eklenmişken, vize ya da final sonucu olmayan öğrenciler için, ilgili sütun değerleri NaN (Not a Number) olarak ayarlandı.

how Parametresi

how parametresi, veri çerçevelerini birleştirirken matematikteki Kümeler konusuna benzer seçenekler sunar. merge() fonksiyonunda how parametresi kullanılmadığı taktirde varsayılan olarak inner seçeneği belirtilmiş olur ve birleştirilecek veri çerçevelerinin sadece ortak değerleri alınarak (ortak küme gibi davranarak) birleştirme işlemi gerçekleştirilir.

Birleştirme işlemi sonucunda Sütun başlıklarının sonuna varsayılan _x ve _y sonekleri eklenir.

how Parametresi için kullanılabilecek seçenekler:

inner Seçeneği

inner seçeneği, sadece iki veri çerçevesinde de bulunan ortak değerleri birleştirir. Tek veri çerçevesinde olan değerler silinir. how = "inner" ibaresini yazsak ta yazmasak ta aynı sonucu elde ederiz. Aşağıdaki İki kod, aynı sonucu verir, deneyip görelim.

print(pd.merge(vize, final, on = "Ogrenci", how = "inner"))
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41 60
1 busra 58 68
print(pd.merge(vize, final, on = "Ogrenci"))
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41 60
1 busra 58 68

outer Seçeneği

outer seçeneği kullanıldığında, iki veri çerçevesinde bulunan tüm değerler birleştirilir. Sol tarafta yazılan veri çerçevesindeki değerler temel alınır. İki veri çerçevesinde bulunan ortak değerler korunur, aksi durumda eksik değerler için NaN değeri atanır.

print(pd.merge(vize, final, on = "Ogrenci", how = "outer"))
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41.0 60.0
1 busra 58.0 68.0
2 ceyhun 73.0 NaN
3 eda 81.0 NaN
4 gamze 95.0 NaN
5 kamil 85.0 NaN
6 derya NaN 74.0
7 fatih NaN 90.0
8 halil NaN 95.0

left Seçeneği

left seçeneği ile yapılan birleştirme işleminde, sol tarafta yazılan veri çerçevesinin tüm değerlerini alır ve sağ tarafta yazılan veri çerçevesindeki ortak değerleri tabloya ekler. Solda yazılan veri çerçevesindeki değerlerin, sağda yazılan veri çerçevesinde karşılığı yoksa, ilgili sütuna NaN değeri atanır. Sağ tarafta yazılan veri çerçevesinin, sol tarafta yazılan veri çerçevesinde karşılığı yoksa, bu değerler yok sayılır, birleştirme işlemine dahil edilmez.

print(pd.merge(vize, final, on = "Ogrenci", how = "left"))
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41 60.0
1 busra 58 68.0
2 ceyhun 73 NaN
3 eda 81 NaN
4 gamze 95 NaN
5 kamil 85 NaN

right Seçeneği

right seçeneği ile yapılan birleştirme işleminde, sağ tarafta yazılan veri çerçevesinin tüm değerlerini alır ve sol tarafta yazılan veri çerçevesindeki ortak değerleri tabloya ekler. Sağda yazılan veri çerçevesindeki değerlerin, solda yazılan veri çerçevesinde karşılığı yoksa, ilgili sütuna NaN değeri atanır. Sol tarafta yazılan veri çerçevesinin, sağ tarafta yazılan veri çerçevesinde karşılığı yoksa, bu değerler yok sayılır, birleştirme işlemine dahil edilmez.

print(pd.merge(vize, final, on = "Ogrenci", how = "right"))
Ogrenci Sinav Sonucu_x Sinav Sonucu_y
0 ali 41.0 60
1 busra 58.0 68
2 derya NaN 74
3 fatih NaN 90
4 halil NaN 95

cross Seçeneği

cross seçeneği sonucunda, kartezyen çarpımı yöntemi ile birleştirme yapılır.

veri1 = pd.DataFrame({'HARF': ['A', 'B', "C"]})
veri2 = pd.DataFrame({'SAYI': [10,20,30]})
print(veri1)
HARF
0 A
1 B
2 C
print(veri2)
SAYI
0 10
1 20
2 30
print(pd.merge(veri1, veri2, how="cross"))
HARF SAYI
0 A 10
1 A 20
2 A 30
3 B 10
4 B 20
5 B 30
6 C 10
7 C 20
8 C 30

left_on Parametresi

Bu parametre opsiyonel yani İsteğe bağlıdır, kullanmak zorunda değilsiniz. Soldaki Veri Çerçevesi üzerinde birleştirmenin hangi düzeyde yapılacağını belirtmek için kullanılır. Sütun başlıklarının sonuna varsayılan _x ve _y sonekleri eklenir.

left_on parametresi, etiket veya liste ya da dizi benzeri veri alır.

right_on Parametresi

Bu parametre opsiyonel yani İsteğe bağlıdır, kullanmak zorunda değilsiniz. Sağdaki Veri Çerçevesi üzerinde birleştirmenin hangi düzeyde yapılacağını belirtmek için kullanılır. Sütun başlıklarının sonuna varsayılan _x ve _y sonekleri eklenir.

right_on parametresi, etiket veya liste ya da dizi benzeri veri alır.

arastirma1 = pd.DataFrame({'Manav_1': ['elma', 'nar', 'portakal', 'elma'],
                    'fiyat': [1, 2, 3, 4]})

arastirma2 = pd.DataFrame({'Manav_2': ['elma', 'nar', 'portakal', 'elma'],
                    'fiyat': [5, 6, 7, 8]})
print(arastirma1)
Manav_1 fiyat
0 elma 1
1 nar 2
2 portakal 3
3 elma 4
print(arastirma2)
Manav_2 fiyat
0 elma 5
1 nar 6
2 portakal 7
3 elma 8
print(arastirma1.merge(arastirma2, left_on='Manav_1', right_on='Manav_2'))
Manav_1 fiyat_x Manav_2 fiyat_y
0 elma 1 elma 5
1 elma 1 elma 8
2 elma 4 elma 5
3 elma 4 elma 8
4 nar 2 nar 6
5 portakal 3 portakal 7
print(arastirma2.merge(arastirma1, right_on='Manav_1', left_on='Manav_2'))
Manav_2 fiyat_x Manav_1 fiyat_y
0 elma 5 elma 1
1 elma 5 elma 4
2 elma 8 elma 1
3 elma 8 elma 4
4 nar 6 nar 2
5 portakal 7 portakal 3

suffixes Parametresi

merge() fonksiyonu ile birleştirme işlemi sonucunda, sütun başlıklarının sonuna _x ve _y soneklerinin dahil edildiğini söyledik. Bu değer vaysayılan değerdir. Bu değeri değiştirmek ve sütun başlıklarının sonuna, istediğimiz değeri eklemek istersek bu işlemi suffixes parametresi ile yapabiliriz.

print(arastirma1.merge(arastirma2, left_on='Manav_1', right_on='Manav_2',
            suffixes=("_bir", "_iki")))
Manav_1 fiyat_bir Manav_2 fiyat_iki
0 elma 1 elma 5
1 elma 1 elma 8
2 elma 4 elma 5
3 elma 4 elma 8
4 nar 2 nar 6
5 portakal 3 portakal 7