Pandas - concat
Cum 15 Temmuz 2022concat() Metodu
Concat kelimesi Concatenate kelimesinin kısaltamasıdır. Concatenate kelimesinin Türkçe karşılığı Birleştir'dir.
concat() metodu ile veri çerçeveleri alt alta ya da yan yana birleştirilebilir. Varsayılan değer satır bazlı yani alt alta birleştirmedir.
Sözdizimi:
pandas.concat(objs, *, axis=0, join='outer', ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=False, copy=None)
Parametreler:
| Parametre | Açıklama |
|---|---|
objs |
Birleştirilecek Series veya DataFrame nesnelerinin bir dizisi (sequence) veya eşlemesi (mapping). Bir eşleme (örneğin bir sözlük) iletilirse, sıralanmış anahtarlar keys argümanı olarak kullanılır. |
axis |
Birleştirmenin yapılacağı ekseni belirteceğimiz parametredir. 0: Satırlar boyunca birleştirme yapılır. (Varsayılan)1: Sütunlar boyunca birleştirme yapılır. |
join |
Diğer eksenlerdeki (birleştirme yapılmayan) indekslerin nasıl ele alınacağını belirtir. Değerler: {'inner', 'outer'}. Varsayılan: 'outer' (tüm indeksleri birleştirir, eşleşmeyen yerlere NaN koyar). |
ignore_index |
bool, değer alır. Varsayılan: False. Eğer True ise, birleştirme ekseni boyunca mevcut indeks değerlerini kullanmaz. Ortaya çıkan eksen 0'dan başlayarak etiketlenir. |
keys |
sequence, Varsayılan: None. Belirtilirse, en dış düzey olarak bu anahtarları kullanarak hiyerarşik bir indeks (MultiIndex) oluşturur. |
levels |
dizilerin listesi, Varsayılan: None. Bir MultiIndex oluşturmak için kullanılacak belirli düzeyleri (benzersiz değerleri) belirtir. Aksi takdirde keys argümanından çıkarılır. |
names |
liste, Varsayılan: None. Sonuçtaki hiyerarşik indeksteki düzeyler için adlar belirtir. |
verify_integrity |
bool, Varsayılan: False. Eğer True ise, yeni birleştirilmiş eksenin yinelenen değerler içerip içermediğini kontrol eder. Bu, veri birleştirmeye göre oldukça maliyetli olabilir. |
sort |
bool, Varsayılan: False. Zaten hizalı değilse, birleştirme dışı ekseni sıralar. |
copy |
bool, Varsayılan: True. Eğer False ise, veriyi gereksiz yere kopyalamamaya çalışır. |
📝 Özet Bilgi
pandas.concat fonksiyonu, temel olarak birden fazla Series veya DataFrame nesnesini belirli bir eksen boyunca (satır veya sütun) birleştirmek için kullanılır. En yaygın kullanımları şunlardır:
-
Satır Ekleme (
axis=0): Birden çok DataFrame'i alt alta (satırlar boyunca) birleştirir. -
Sütun Ekleme (
axis=1): Birden çok DataFrame'i yan yana (sütunlar boyunca) birleştirir. -
İndeks Yönetimi:
joinparametresi ile eksik verilerin nasıl ele alınacağını (innerveyaouter),ignore_indexile de indekslerin sıfırlanıp sıfırlanmayacağını kontrol edebilirsiniz.
Birleştirme örneklerini öğrenemek için öncelikle 2 sözlük yapısı oluşturup, bunları veri çerçevesine dönüştürelim.
veri1 = {'A': ['A1','A2','A3','A4'],
'B': ['B1','B2','B3','B4'],
'C': ['C1','C2','C3','C4']}
veri2 = {'A': ['A5','A6','A7','A8'],
'B': ['B5','B6','B7','B8'],
'C': ['C5','C6','C7','C8']}
df1 = pd.DataFrame(veri1, index = [1,2,3,4])
df2 = pd.DataFrame(veri2, index = [5,6,7,8])
print(df1)
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
| 3 | A3 | B3 | C3 |
| 4 | A4 | B4 | C4 |
print(df2)
| A | B | C | |
|---|---|---|---|
| 5 | A5 | B5 | C5 |
| 6 | A6 | B6 | C6 |
| 7 | A7 | B7 | C7 |
| 8 | A8 | B8 | C8 |
Oluşturduğumuz veri çerçevelerini, concat() fonksiyonu ile birleştirelim. concat() fonksiyonuna en az iki adet veri çevçevesi eklemek gerekir. Malumunuz, Pandas'ta genellikle birden fazla parametre, seçenek ekleneceği zaman, bu değerler köşeli parantez içerisinde yani liste veri tipi olarak yazılır.
print(pd.concat([df1, df2]))
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
| 3 | A3 | B3 | C3 |
| 4 | A4 | B4 | C4 |
| 5 | A5 | B5 | C5 |
| 6 | A6 | B6 | C6 |
| 7 | A7 | B7 | C7 |
| 8 | A8 | B8 | C8 |
Gördüğünüz gibi, iki veri çerçevesi altalta birleştirildi.
Parametreler
axis parametresi
Hatırlarsanız drop() metodunu anlatırken axis parametresinden bahsetmiştik. axis parametresi, 0 ve 1 değerlerini alır, 0 satırları, 1 ise sütunları temsil eder demiştik. Aynı parametreyi birleştirme işleminde de kullanabiliriz. eğer axis parametresi kullanılmaz ise, varsayılan değer axis = 0 olduğu için yani satırları baz alarak birleştirme yapılır.
Şimdi axis=1 parametresini ekleyerek veri çerçevelerini yanyana birleştirmeyi deneyelim.
print(pd.concat([df1, df2], axis = 1))
| A | B | C | A | B | C | |
|---|---|---|---|---|---|---|
| 1 | A1 | B1 | C1 | NaN | NaN | NaN |
| 2 | A2 | B2 | C2 | NaN | NaN | NaN |
| 3 | A3 | B3 | C3 | NaN | NaN | NaN |
| 4 | A4 | B4 | C4 | NaN | NaN | NaN |
| 5 | NaN | NaN | NaN | A5 | B5 | C5 |
| 6 | NaN | NaN | NaN | A6 | B6 | C6 |
| 7 | NaN | NaN | NaN | A7 | B7 | C7 |
| 8 | NaN | NaN | NaN | A8 | B8 | C8 |
Bu durumda, 2 veri çerçevesi yanyana birleştirildi ancak veri çerçevelerinde aynı indeks değerleri bulunmadığı için ilgili indeks değerinin karşılığında NaN (Not A Number) değeri atandı.
Eğer aşağıdaki gibi bir veri çerçevemiz olsaydı ve bu veri çerçevesini df1 ile yanyana birleştirseydik nasıl bir sonuç elde ederdik dersiniz.
veri3 = {'A': ['A5','A6','A7','A8'],'B': ['B5','B6','B7','B8'],'C': ['C5','C6','C7','C8']}
df3 = pd.DataFrame(veri3, index = [1,6,3,8])
print(df3)
| A | B | C | |
|---|---|---|---|
| 1 | A5 | B5 | C5 |
| 6 | A6 | B6 | C6 |
| 3 | A7 | B7 | C7 |
| 8 | A8 | B8 | C8 |
print(pd.concat([df1, df3], axis = 1))
| A | B | C | A | B | C | |
|---|---|---|---|---|---|---|
| 1 | A1 | B1 | C1 | A5 | B5 | C5 |
| 2 | A2 | B2 | C2 | NaN | NaN | NaN |
| 3 | A3 | B3 | C3 | A7 | B7 | C7 |
| 4 | A4 | B4 | C4 | NaN | NaN | NaN |
| 6 | NaN | NaN | NaN | A6 | B6 | C6 |
| 8 | NaN | NaN | NaN | A8 | B8 | C8 |
df1 ve df3'te ortak indeks değerleri olduğu için 1. ve 3. satırlar tamamen geçerli veri ile doldu.
concat metodu sadece 2 veri çerçevesini birleştirmiyor. 2'den fazla veri çerçevesini de birleştiriyor. Oluşturduğumuz df1, df2 ve df3 veri çerçevelerini altalta ve yanyana birleştirip sonuçları inceleyelim.
print(pd.concat([df1, df2, df3]))
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
| 3 | A3 | B3 | C3 |
| 4 | A4 | B4 | C4 |
| 5 | A5 | B5 | C5 |
| 6 | A6 | B6 | C6 |
| 7 | A7 | B7 | C7 |
| 8 | A8 | B8 | C8 |
| 1 | A5 | B5 | C5 |
| 6 | A6 | B6 | C6 |
| 3 | A7 | B7 | C7 |
| 8 | A8 | B8 | C8 |
print(pd.concat([df1, df2, df3], axis = 1))
| A | B | C | A | B | C | A | B | C | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | A1 | B1 | C1 | NaN | NaN | NaN | A5 | B5 | C5 |
| 2 | A2 | B2 | C2 | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | A3 | B3 | C3 | NaN | NaN | NaN | A7 | B7 | C7 |
| 4 | A4 | B4 | C4 | NaN | NaN | NaN | NaN | NaN | NaN |
| 5 | NaN | NaN | NaN | A5 | B5 | C5 | NaN | NaN | NaN |
| 6 | NaN | NaN | NaN | A6 | B6 | C6 | A6 | B6 | C6 |
| 7 | NaN | NaN | NaN | A7 | B7 | C7 | NaN | NaN | NaN |
| 8 | NaN | NaN | NaN | A8 | B8 | C8 | A8 | B8 | C8 |
ignore_index Parametresi
Bu parametre, birleştirme işlemi esnasında index değerlerinin orijinal değerlerinin tutulması ya da birleştirilme sonrası yeni index değeri atanması için kullanılır.
Mevcut klasördeki tüm CSV uzantılı dosyaları hem ignore_index
parametresi kullanarak hemde kullanmadan birleştirelim.
import glob
import pandas as pd
dosyalar = glob.glob("*.csv")
Tumu = pd.concat((pd.read_csv(dosya) for dosya in dosyalar))
print(Tumu)
Çıktı:
baslik1 baslik2 baslik3
0 100 200 300
1 400 500 600
2 700 800 900
0 10 20 30
1 40 50 60
2 70 80 90
0 1 2 3
1 4 5 6
2 7 8 9
ignore_index Parametresi kullanılmadan birleştirme yapıldığında, index değerleri, her dosyada olduğu gibi kalır.
ignore_index Parametresini kullanarak birleştirme işlemi sonucuna bakalım;
import glob
import pandas as pd
dosyalar = glob.glob("*.csv")
Tumu = pd.concat((pd.read_csv(dosya) for dosya in dosyalar), ignore_index=True)
print(Tumu)
Çıktı:
baslik1 baslik2 baslik3
0 100 200 300
1 400 500 600
2 700 800 900
3 10 20 30
4 40 50 60
5 70 80 90
6 1 2 3
7 4 5 6
8 7 8 9
Görüldüğü üzere, kodaignore_index=True ifadesi eklendiğinde dosyaların index değerleri gözardı edilerek birleştirme işlemi sonrası yeniden oluşturuluyor.