Kurs
Hiç bir Kaggle yarışmasını çözmeyi denediniz mi? Eğer denediyseniz, çoğu yarışmada size sağlanan verilerin birden fazla dosyada bulunduğunu ve bazı sütunların birden fazla dosyada tekrarlandığını fark etmiş olabilirsiniz. Peki aklınıza gelen ilk şey nedir? Elbette onları birleştirmek!
Bu eğitimde, birkaç standart pandas birleştirme tekniğini pratik edeceksiniz. Daha spesifik olarak şunları öğreneceksiniz:
- DataFrame’leri satır veya sütun bazında birleştirmek.
- Belirli anahtarlar üzerinde left join, inner join gibi farklı mantıklarla DataFrame’leri birleştirmek.
- DataFrame’leri indeks üzerinden join etmek.
- pandas’ın sunduğu zaman serisi dostu birleştirme yöntemleri
Bu süreçte, birleştirme öncesi ve sonrasında ihtiyaç duyacağınız birkaç püf noktasını da öğreneceksiniz.
Özet
- DataFrame’leri dikey (satırlar) veya yatay (sütunlar) olarak istiflemede
pd.concat()kullanın - SQL join’larına benzer şekilde ortak sütunlarda birleştirme için
pd.merge()kullanın - Join türünü
howparametresiyle belirtin:'inner','outer','left'veya'right' - İndeks tabanlı DataFrame birleştirmeleri için
.join()kullanın - En yakın anahtarla eşleştirme gereken zaman serisi verileri için
pd.merge_asof()kullanın
pandas ile Birleştirme
DataFrame’leri birleştirmek ve kaynaştırmak, veri analizi ve makine öğrenmesi görevlerine başlarken temel işlemdir. Hemen her durumda veriler birden fazla kaynaktan ve dosyadan geldiği için, her Veri Analisti veya Veri Bilimcisinin ustalaşması gereken araç setlerinden biridir. Tüm verileri belirli bir join mantığıyla tek bir yerde toplamanız ve ardından analize başlamanız gerekebilir. SQL join’larıyla çalışanlar bu görevin önemini iyi bilir. Hatta bazı veriler üzerinde makine öğrenmesi modeli kurmak istediğinizde, birden fazla csv dosyasını tek bir DataFrame’de birleştirmeniz gerekebilir.
Neyse ki Python’daki en popüler kütüphane olan pandas imdadınıza yetişiyor! pandas, Series ve DataFrame’leri birleştirmeyi kolaylaştıran çeşitli olanaklar sunar; indeksler için küme mantığı ve join/merge türü işlemlerde ilişkisel cebir işlevselliği sağlar.
Bu eğitimdeki kodu çevrimiçi olarak çalıştırın ve düzenleyin
Kodu çalıştırpandas Concatenate
Eğitim boyunca kullanacağınız kütüphaneyi içe aktararak başlayın: pandas
import pandas as pd
Bu eğitimde tüm işlemleri oluşturacağınız örnek (dummy) DataFrame’ler üzerinde yapacaksınız. Bir DataFrame oluşturmak için şu şekilde bir Python sözlüğü kullanabilirsiniz:
dummy_data1 = {
'id': ['1', '2', '3', '4', '5'],
'Feature1': ['A', 'C', 'E', 'G', 'I'],
'Feature2': ['B', 'D', 'F', 'H', 'J']}
Burada dummy_data1 sözlüğünün anahtarları sütun adlarıdır ve listedeki değerler her bir gözlem ya da satıra karşılık gelen verilerdir. Bunu bir pandas DataFrame’ine dönüştürmek için pandas’ın DataFrame() fonksiyonunu ve sütunları adlandırmak için columns argümanını kullanacaksınız:
df1 = pd.DataFrame(dummy_data1, columns = ['id', 'Feature1', 'Feature2'])
df1
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
Gördüğünüz gibi artık id, Feature1 ve Feature2 adlı üç sütunlu bir DataFrame’iniz var. pandas, satır etiketleri olarak dahili bir isimsiz sütun daha oluşturur. Bir önceki df1 DataFrame’ine benzer şekilde iki DataFrame daha, df2 ve df3, oluşturacaksınız:
dummy_data2 = {
'id': ['1', '2', '6', '7', '8'],
'Feature1': ['K', 'M', 'O', 'Q', 'S'],
'Feature2': ['L', 'N', 'P', 'R', 'T']}
df2 = pd.DataFrame(dummy_data2, columns = ['id', 'Feature1', 'Feature2'])
df2
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
dummy_data3 = {
'id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
'Feature3': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23]}
df3 = pd.DataFrame(dummy_data3, columns = ['id', 'Feature3'])
df3
| id | Feature3 | |
|---|---|---|
| 0 | 1 | 12 |
| 1 | 2 | 13 |
| 2 | 3 | 14 |
| 3 | 4 | 15 |
| 4 | 5 | 16 |
| 5 | 7 | 17 |
| 6 | 8 | 15 |
| 7 | 9 | 12 |
| 8 | 10 | 13 |
| 9 | 11 | 23 |
concat()
DataFrame’leri yalnızca satır bazında birleştirmek için pandas’taki concat() fonksiyonunu kullanabilirsiniz. concat() fonksiyonuna argüman olarak DataFrame adlarını bir liste içinde geçirmeniz gerekir:
df_row = pd.concat([df1, df2])
df_row
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
df1 ve df2 DataFrame’lerinin artık satır bazında tek bir df_row DataFrame’inde birleştirildiğini görebilirsiniz. Ancak satır etiketleri hatalı görünüyor. Satır etiketlerinin join’e göre otomatik ayarlanmasını isterseniz, concat() fonksiyonunu çağırırken ignore_index argümanını True olarak ayarlamalısınız:
df_row_reindex = pd.concat([df1, df2], ignore_index=True)
df_row_reindex
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
| 5 | 1 | K | L |
| 6 | 2 | M | N |
| 7 | 6 | O | P |
| 8 | 7 | Q | R |
| 9 | 8 | S | T |
Artık satır etiketleri doğru!
pandas ayrıca, birleştirmeden sonra DataFrame’leri bir anahtarla etiketleme seçeneği de sunar; böylece hangi verinin hangi DataFrame’den geldiğini bilebilirsiniz. Bunu, keys adlı ek argümana DataFrame etiket adlarını bir liste olarak vererek sağlayabilirsiniz. Burada aynı birleştirmeyi df1 ve df2 DataFrame’leri için sırasıyla x ve y anahtarlarıyla yapacaksınız.
frames = [df1,df2]
df_keys = pd.concat(frames, keys=['x', 'y'])
df_keys
| id | Feature1 | Feature2 | ||
|---|---|---|---|---|
| x | 0 | 1 | A | B |
| 1 | 2 | C | D | |
| 2 | 3 | E | F | |
| 3 | 4 | G | H | |
| 4 | 5 | I | J | |
| y | 0 | 1 | K | L |
| 1 | 2 | M | N | |
| 2 | 6 | O | P | |
| 3 | 7 | Q | R | |
| 4 | 8 | S | T |
Anahtarları belirtmek, belirli bir DataFrame’e karşılık gelen verilerin alınmasını da kolaylaştırır. y etiketiyle işaretlenmiş df2 DataFrame’inin verilerini loc yöntemiyle alabilirsiniz:
df_keys.loc['y']
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
Ayrıca concat()’e bir sözlük de geçebilirsiniz; bu durumda sözlük anahtarları, (başka anahtarlar belirtilmedikçe) keys argümanı için kullanılır:
pieces = {'x': df1, 'y': df2}
df_piece = pd.concat(pieces)
df_piece
| id | Feature1 | Feature2 | ||
|---|---|---|---|---|
| x | 0 | 1 | A | B |
| 1 | 2 | C | D | |
| 2 | 3 | E | F | |
| 3 | 4 | G | H | |
| 4 | 5 | I | J | |
| y | 0 | 1 | K | L |
| 1 | 2 | M | N | |
| 2 | 6 | O | P | |
| 3 | 7 | Q | R | |
| 4 | 8 | S | T |
concat()’ın verinin tam bir kopyasını oluşturduğunu ve bu fonksiyonun sürekli yeniden kullanılmasının ciddi bir performans kaybına yol açabileceğini not etmek gerekir. Büyük ölçekli veri işlemleri için yüksek performanslı veri işleme için pandas 2.0 ve polars seçeneklerini değerlendirin. İşlemi birçok veri kümesi üzerinde kullanmanız gerekiyorsa, liste üreteci kullanın.
frames = [ process_your_file(f) for f in files ]
result = pd.concat(frames)
DataFrame’leri sütun bazında birleştirmek için axis parametresini 1 olarak belirtebilirsiniz:
df_col = pd.concat([df1,df2], axis=1)
df_col
| id | Feature1 | Feature2 | id | Feature1 | Feature2 | |
|---|---|---|---|---|---|---|
| 0 | 1 | A | B | 1 | K | L |
| 1 | 2 | C | D | 2 | M | N |
| 2 | 3 | E | F | 6 | O | P |
| 3 | 4 | G | H | 7 | Q | R |
| 4 | 5 | I | J | 8 | S | T |
pandas Merge DataFrame’ler
DataFrame’lerle ilgili bir diğer yaygın işlem de merge (birleştirme) işlemidir. İki DataFrame, aynı varlık hakkında farklı türde bilgiler tutabilir ve bazı ortak özellik/sütunlarla ilişkilendirilebilir. Bu DataFrame’leri birleştirmek için pandas, concat(), merge(), join() gibi birden çok fonksiyon sağlar. Bu bölümde pandas’ın merge() fonksiyonunu kullanmayı pratik edeceksiniz.
Satır bazında df1 ve df2’yi birleştirerek oluşturduğunuz df_row ile df3’ü, ortak sütun (veya anahtar) olan id üzerinde birleştirebilirsiniz. Bunun için merge() fonksiyonuna DataFrame adlarını ve ortak sütun adı olan id’yi belirtmek üzere ek on argümanını geçin:
df_merge_col = pd.merge(df_row, df3, on='id')
df_merge_col
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
Artık DataFrame’lerin, her ikisinin de id sütununda bulunan ortak değerlere göre tek bir DataFrame’de birleştiğini görebilirsiniz. Örneğin burada id değeri 1, df_row DataFrame’inde hem A, B hem de K, L ile bulunduğundan, df_merge_col adlı nihai DataFrame’de iki kez tekrarlandı; Feature3’ün 12 değeri ise df3 DataFrame’inden geldi ve tekrarlandı.
Birleştirmek istediğiniz sütunların adları farklı olabilir (bu örnekteki gibi değil). Bu tür birleştirmeler için, left_on argümanını sol DataFrame’deki sütun adı, right_on argümanını sağ DataFrame’deki sütun adı olarak belirtmelisiniz, örneğin:
df_merge_difkey = pd.merge(df_row, df3, left_on='id', right_on='id')
df_merge_difkey
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
pd.concat() kullanarak bir DataFrame’e satır da ekleyebilirsiniz. Önce satır verileriyle yeni bir DataFrame oluşturun, sonra orijinal DataFrame ile birleştirin:
add_row = pd.DataFrame([['10', 'X1', 'X2', 'X3']],
columns=['id', 'Feature1', 'Feature2', 'Feature3'])
df_add_row = pd.concat([df_merge_col, add_row], ignore_index=True)
df_add_row
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
| 9 | 10 | X1 | X2 | X3 |
pandas Join Türleri
Bu bölümde, ortak bir sütun/anahtar temelinde pandas DataFrame’lerini birleştirmek için kullanılabilen farklı join mantıklarını pratik edeceksiniz. Bu join’ların mantığı, SQL’de tabloları birleştirirken kullandıklarınıza oldukça benzer. SQL’de inner ve outer join kavramlarına aşinaysanız, bu kavramlar size tanıdık gelecektir.
| Join Türü | SQL Karşılığı | Sonuç | Kullanım Amacı |
|---|---|---|---|
inner |
INNER JOIN | Yalnızca her iki DataFrame’de eşleşen satırlar | Yalnızca her iki tabloda da bulunan kayıtları istediğinizde |
left |
LEFT OUTER JOIN | Soldaki tüm satırlar + sağdan eşleşenler | Birincil DataFrame’deki tüm kayıtları korumak istediğinizde |
right |
RIGHT OUTER JOIN | Sağdaki tüm satırlar + soldan eşleşenler | İkincil DataFrame’deki tüm kayıtları korumak istediğinizde |
outer |
FULL OUTER JOIN | Her iki DataFrame’den tüm satırlar | Her iki tablonun tam birleşimine ihtiyaç duyduğunuzda |
Full Outer Join
FULL OUTER JOIN, sol ve sağ outer join sonuçlarının birleşimidir. Birleştirilen DataFrame, her iki DataFrame’den de tüm kayıtları içerir ve her iki tarafta eksik eşleşmeler için NaN değerleri ile doldurur. merge() fonksiyonunda how argümanını outer olarak belirterek full outer join yapabilirsiniz:
df_outer = pd.merge(df1, df2, on='id', how='outer')
df_outer
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
Ortaya çıkan DataFrame’in her iki tablodaki tüm kayıtları içerdiğini ve eksik eşleşmelerde NaN değerleri bulunduğunu görebilirsiniz. Dikkat edilmesi gereken bir diğer nokta ise, hangi sütunun hangi DataFrame’den geldiğini göstermek için sütun adlarına eklenen soneklerdir. Varsayılan sonekler x ve y’dir; ancak merge() fonksiyonunda suffixes argümanını belirterek bunları değiştirebilirsiniz:
df_suffix = pd.merge(df1, df2, left_on='id',right_on='id',how='outer',suffixes=('_left','_right'))
df_suffix
| id | Feature1_left | Feature2_left | Feature1_right | Feature2_right | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
Inner Join
INNER JOIN, yalnızca hem A hem de B DataFrame’lerinde eşleşen kayıt kümesini üretir. Inner join yapmak için merge() fonksiyonunun how argümanına inner geçmeniz gerekir:
df_inner = pd.merge(df1, df2, on='id', how='inner')
df_inner
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
Right Join
RIGHT JOIN, B DataFrame’inden (sağ DataFrame) tüm kayıtları ve A DataFrame’inde (sol DataFrame) eşleşen kayıtları (varsa) üretir. Eşleşme yoksa sağ tarafta null bulunur. Right join yapmak için merge() fonksiyonunun how argümanına right geçmelisiniz:
df_right = pd.merge(df1, df2, on='id', how='right')
df_right
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 6 | NaN | NaN | O | P |
| 3 | 7 | NaN | NaN | Q | R |
| 4 | 8 | NaN | NaN | S | T |
Left Join
LEFT JOIN, A DataFrame’inden (sol DataFrame) tüm kayıtları ve B DataFrame’inde (sağ DataFrame) eşleşen kayıtları (varsa) üretir. Eşleşme yoksa sol tarafta null bulunur. Left join yapmak için merge() fonksiyonunun how argümanına left geçmelisiniz:
df_left = pd.merge(df1, df2, on='id', how='left')
df_left
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
İndekste Join
Bazen join’i indeksler veya satır etiketleri üzerinde gerçekleştirmeniz gerekebilir. Bunu yapmak için, right_index (sağ DataFrame’in indeksleri) ve left_index (sol DataFrame’in indeksleri) argümanlarını True olarak belirtmelisiniz:
df_index = pd.merge(df1, df2, right_index=True, left_index=True)
df_index
| id_x | Feature1_x | Feature2_x | id_y | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|---|
| 0 | 1 | A | B | 1 | K | L |
| 1 | 2 | C | D | 2 | M | N |
| 2 | 3 | E | F | 6 | O | P |
| 3 | 4 | G | H | 7 | Q | R |
| 4 | 5 | I | J | 8 | S | T |
pandas Join
pandas DataFrame.join() yöntemi, DataFrame’leri benzersiz indeksler üzerinden birleştirmede kullanılır. `on` isteğe bağlı argümanıyla indeks üzerinde join edilecek sütun ad(lar)ını, how argümanlarıyla da iki nesnenin nasıl birleştirileceğini belirleyebilirsiniz. Varsayılan olarak inner join kullanır.
pandas ile İki DataFrame Join Etme
.join kullanarak iki veri çerçevesini birleştirelim. Sütun çakışması hatasını önlemek için `lsuffix` ve `rsuffix` sağladık. Join işlemi sütun üzerinde değil indeks üzerinde yapıldığından, ya ‘id’ sütununu değiştirmemiz ya da bir sonek vermemiz gerekir.
df2.join(df3, lsuffix='_left', rsuffix='_right')
| id_left | Feature1 | Feature2 | id_right | Feature3 | |
|---|---|---|---|---|---|
| 0 | 1 | K | L | 1 | 12 |
| 1 | 2 | M | N | 2 | 13 |
| 2 | 6 | O | P | 3 | 14 |
| 3 | 7 | Q | R | 4 | 15 |
| 4 | 8 | S | T | 5 | 16 |
`on` argümanını kullanarak da sütunları indeks üzerinde join edebiliriz. Join’in başarılı olması için df3’ün ‘id’ sütununu indekse çevirmeli ve `on` argümanına ‘id’ sütununu vermeliyiz. Varsayılan olarak left join kullanır.
df2.join(df3.set_index('id'), on='id')
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | K | L | 12.0 |
| 1 | 2 | M | N | 13.0 |
| 2 | 6 | O | P | NaN |
| 3 | 7 | Q | R | 17.0 |
| 4 | 8 | S | T | 15.0 |
merge fonksiyonunda olduğu gibi, join’in işleyişini `how` argümanını vererek değiştirebiliriz. Bizim durumda inner join kullanacağız.
df2.join(df3.set_index('id'), on='id', how = "inner")
| id_left | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | K | L | 12 |
| 1 | 2 | M | N | 13 |
| 3 | 7 | Q | R | 17 |
| 4 | 8 | S | T | 15 |
Zaman Serisi Dostu Birleştirme
pandas, zaman serisi DataFrame’lerini birleştirmek için özel fonksiyonlar sağlar. Bunların belki de en kullanışlı ve popüleri merge_asof() fonksiyonudur. merge_asof(), sıralı bir left join’e benzer; ancak eşit anahtarlar yerine en yakın anahtara göre eşleştirir. Sol DataFrame’deki her satır için, sağ DataFrame’deki on anahtarı solun anahtarından küçük olan son satırı seçersiniz. Her iki DataFrame de anahtara göre sıralanmış olmalıdır.
İsteğe bağlı olarak asof merge, grup bazlı bir birleştirme de yapabilir. Bu, on anahtarındaki en yakın eşleşmeye ek olarak by anahtarını eşit şekilde eşleştirir.
Örneğin, elinizde işlemler (trades) ve kotasyonlar (quotes) olabilir ve bunları asof merge ile birleştirmek isteyebilirsiniz. Burada sol DataFrame trades, sağ DataFrame quotes olarak seçilir. time anahtarı üzerinde asof merge yapılır ve sembole (ticker) göre grup bazlı birleştirme uygulanır.
trades = pd.DataFrame({
'time': pd.to_datetime(['20160525 13:30:00.023',
'20160525 13:30:00.038',
'20160525 13:30:00.048',
'20160525 13:30:00.048',
'20160525 13:30:00.048']),
'ticker': ['MSFT', 'MSFT','GOOG', 'GOOG', 'AAPL'],
'price': [51.95, 51.95,720.77, 720.92, 98.00],
'quantity': [75, 155,100, 100, 100]},
columns=['time', 'ticker', 'price', 'quantity'])
quotes = pd.DataFrame({
'time': pd.to_datetime(['20160525 13:30:00.023',
'20160525 13:30:00.023',
'20160525 13:30:00.030',
'20160525 13:30:00.041',
'20160525 13:30:00.048',
'20160525 13:30:00.049',
'20160525 13:30:00.072',
'20160525 13:30:00.075']),
'ticker': ['GOOG', 'MSFT', 'MSFT','MSFT', 'GOOG', 'AAPL', 'GOOG','MSFT'],
'bid': [720.50, 51.95, 51.97, 51.99,720.50, 97.99, 720.50, 52.01],
'ask': [720.93, 51.96, 51.98, 52.00,720.93, 98.01, 720.88, 52.03]},
columns=['time', 'ticker', 'bid', 'ask'])
trades
| time | ticker | price | quantity | |
|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 |
quotes
| time | ticker | bid | ask | |
|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | GOOG | 720.50 | 720.93 |
| 1 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 51.96 |
| 2 | 2016-05-25 13:30:00.030 | MSFT | 51.97 | 51.98 |
| 3 | 2016-05-25 13:30:00.041 | MSFT | 51.99 | 52.00 |
| 4 | 2016-05-25 13:30:00.048 | GOOG | 720.50 | 720.93 |
| 5 | 2016-05-25 13:30:00.049 | AAPL | 97.99 | 98.01 |
| 6 | 2016-05-25 13:30:00.072 | GOOG | 720.50 | 720.88 |
| 7 | 2016-05-25 13:30:00.075 | MSFT | 52.01 | 52.03 |
df_merge_asof = pd.merge_asof(trades, quotes,
on='time',
by='ticker')
df_merge_asof
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | 51.97 | 51.98 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
Dikkatlice incelerseniz, AAPL satırında NaN görünmesinin nedenini fark edebilirsiniz. Sağdaki quotes DataFrame’inde, AAPL sembolü için 13:30:00.048’den (soldaki tablodaki zaman) daha küçük bir zaman değeri bulunmadığından, bid ve ask sütunlarına NaN’ler yerleştirildi.
Zaman sütunu için önceden tanımlı bir tolerans seviyesi de ayarlayabilirsiniz. Örneğin, yalnızca kotasyon zamanı ile işlem zamanı arasında 2 ms içinde asof merge yapmak istiyorsanız, tolerance argümanını belirtmelisiniz:
df_merge_asof_tolerance = pd.merge_asof(trades, quotes,
on='time',
by='ticker',
tolerance=pd.Timedelta('2ms'))
df_merge_asof_tolerance
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | NaN | NaN |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
Yukarıdaki sonuç ile önceki sonuç arasındaki farka dikkat edin. Zaman toleransı 2 ms’i karşılamıyorsa satırlar birleştirilmez.
Sonuç
Bu eğitimde, pandas kütüphanesinin concat() ve merge() fonksiyonlarını kullanarak farklı mantıklara göre DataFrame’leri nasıl birleştireceğinizi öğrendiniz. Sonlara doğru, zaman serisi DataFrame’lerini birleştirmek için özel merge_asof() fonksiyonunu da pratik ettiniz. Bu süreçte DataFrame indeksleri ile çalışmayı da öğrendiniz. pandas’ta DataFrame’leri birleştirmek için keşfedebileceğiniz daha pek çok seçenek var; harika belgelerine göz atmanızı öneririm. İyi keşifler!
Bu eğitim, yazımında yardımcı olması için şu pandas dokümantasyonundan yararlanmıştır.
pandas hakkında daha fazla bilgi edinmek isterseniz, DataCamp’in Data Manipulation with pandas kursunu alın ve Python Pandas’ta DataFrame’ler eğitimimize göz atın.
DataCamp’in ayrıca şu kullanışlı pandas eğitimleri de vardır:
- CSV verilerini pandas’a aktarma
- pandas’ta sütun ekleme
- pandas’ta değerleri sıralama
- pandas’ta
drop_duplicatesile yinelenenleri kaldırma - pandas groupby ile verileri gruplama
- pandas’ta DataFrame indekslerini sıfırlama
İyi öğrenmeler!
SSS
pandas’ta merge() ile join() arasındaki fark nedir?
merge() daha esnektir ve SQL join’larına benzer şekilde herhangi bir sütun(lar) üzerinde DataFrame’leri birleştirebilir. join() öncelikle indekslerde join için tasarlanmıştır ve dahili olarak merge()’ü çağıran bir kolaylık yöntemidir. Sütunlar üzerinde join yaparken merge(), join anahtarlarınız zaten indeks olarak ayarlanmışsa join() kullanın.
pandas’ta DataFrame’leri birden çok sütunda nasıl birleştiririm?
on parametresine sütun adlarından oluşan bir liste geçin: pd.merge(df1, df2, on=['col1', 'col2']). Sütun adları DataFrame’ler arasında farklıysa, listelerle birlikte left_on ve right_on kullanın: pd.merge(df1, df2, left_on=['a', 'b'], right_on=['c', 'd']).
DataFrame’leri birleştirirken eksik değerlere ne olur?
Davranış, join türüne bağlıdır. inner join’de eşleşmeyen satırlar dışlanır. left, right veya outer join’lerde eşleşmeyen satırlar korunur ve diğer DataFrame’den gelen sütunlarda NaN değerleriyle doldurulur. Birleştirmeden sonra bunları fillna() veya dropna() ile ele alabilirsiniz.
pandas’ta concat() ile merge()’ü ne zaman kullanmalıyım?
concat(), DataFrame’leri düşeyde (satır ekleme) veya yatayda (sütun ekleme) indeks hizalamasına göre istiflemek için kullanılır. merge(), SQL join’larına benzer şekilde ortak sütun değerlerine göre DataFrame’leri birleştirmeniz gerektiğinde kullanılır. concat()’ı DataFrame’leri "yapıştırmak" gibi, merge()’ü ise ilişkisel join’lar için düşünün.
pandas merge işleminden sonra yinelenen sütun adlarını nasıl ele alırım?
Varsayılan olarak pandas, yinelenen sütun adlarına _x ve _y soneklerini ekler. Bunu suffixes parametresiyle özelleştirin: pd.merge(df1, df2, on='id', suffixes=('_left', '_right')). Birleştirmeden sonra sütunları df.rename(columns={'old': 'new'}) ile yeniden adlandırabilir veya df.drop(columns=['col_y']) ile yinelenenleri kaldırabilirsiniz.
pandas’ta merge() ile join() arasındaki fark nedir?
merge() daha esnektir ve SQL join’larına benzer şekilde herhangi bir sütun(lar) üzerinde DataFrame’leri birleştirebilir. join() öncelikle indekslerde join için tasarlanmıştır ve dahili olarak merge()’ü çağıran bir kolaylık yöntemidir. Sütunlar üzerinde join yaparken merge(), join anahtarlarınız zaten indeks olarak ayarlanmışsa join() kullanın.
pandas’ta DataFrame’leri birden çok sütunda nasıl birleştiririm?
on parametresine sütun adlarından oluşan bir liste geçin: pd.merge(df1, df2, on=['col1', 'col2']). Sütun adları DataFrame’ler arasında farklıysa, listelerle birlikte left_on ve right_on kullanın: pd.merge(df1, df2, left_on=['a', 'b'], right_on=['c', 'd']).
DataFrame’leri birleştirirken eksik değerlere ne olur?
Davranış, join türüne bağlıdır. inner join’de eşleşmeyen satırlar dışlanır. left, right veya outer join’lerde eşleşmeyen satırlar korunur ve diğer DataFrame’den gelen sütunlarda NaN değerleriyle doldurulur. Birleştirmeden sonra bunları fillna() veya dropna() ile ele alabilirsiniz.
pandas’ta concat() ile merge()’ü ne zaman kullanmalıyım?
concat(), DataFrame’leri düşeyde (satır ekleme) veya yatayda (sütun ekleme) indeks hizalamasına göre istiflemek için kullanılır. merge(), SQL join’larına benzer şekilde ortak sütun değerlerine göre DataFrame’leri birleştirmeniz gerektiğinde kullanılır. concat()’ı DataFrame’leri "yapıştırmak" gibi, merge()’ü ise ilişkisel join’lar için düşünün.
pandas merge işleminden sonra yinelenen sütun adlarını nasıl ele alırım?
Varsayılan olarak pandas, yinelenen sütun adlarına _x ve _y soneklerini ekler. Bunu suffixes parametresiyle özelleştirin: pd.merge(df1, df2, on='id', suffixes=('_left', '_right')). Birleştirmeden sonra sütunları df.rename(columns={'old': 'new'}) ile yeniden adlandırabilir veya df.drop(columns=['col_y']) ile yinelenenleri kaldırabilirsiniz.