Pandalarda merge () ve concat () arasındaki fark (lar)


89

Arasındaki temel fark (lar) nedir pd.DataFrame.merge()ve pd.concat()?

Şimdiye kadar bulduğum şey buydu, lütfen anlayışımın ne kadar eksiksiz ve doğru olduğunu yorumlayın:

  • .merge()yalnızca sütunları (artı satır indisleri) kullanabilir ve anlamsal olarak veritabanı tarzı işlemler için uygundur. .concat()sadece endeksler kullanılarak her iki eksenle de kullanılabilir ve hiyerarşik bir dizin ekleme seçeneği sunar.

  • Bu arada, bu aşağıdaki artıklığa izin verir: her ikisi de satır endekslerini kullanarak iki veri çerçevesini birleştirebilir.

  • pd.DataFrame.join() yalnızca kullanım durumlarının bir alt kümesi için bir kısaltma sunar .merge()

(Pandalar, veri analizinde çok geniş bir kullanım alanı yelpazesini ele almakta harikadır. Belirli bir görevi yerine getirmenin en iyi yolunun ne olduğunu bulmak için belgeleri araştırmak biraz ürkütücü olabilir.)


3
Ayrıca ilgili: stackoverflow.com/a/37891437/1972495.merge() ve etrafında bir tartışma .join().
WindChimes

2
Birleştirme, birleştirme ve birleştirme konusunda, bu cevabı hepsinin aynı şeyleri yapmak için nasıl kullanılabileceği konusunda çok net buluyorum (aynı işlevselliğe sadece alternatif bir arayüz gibi görünüyorlar). Sorunuz (ve yorumda bağladığınız yanıt) sayesinde, birleştirme ve katılmanın nasıl ilişkili olduğunu nihayet anladığımı biliyorum.
Concat'ın

Yanıtlar:


79

Çok yüksek bir seviye farkı, merge()iki (veya daha fazla) veri çerçevesini ortak sütunların değerleri temelinde birleştirmek için kullanılır (endeksler de kullanılabilir, kullanılabilir left_index=Trueve / veya right_index=True) ve concat()bir (veya daha fazla) veri çerçevesini bir diğerinin altında (veya yana doğru, axisseçeneğin 0 veya 1 olarak ayarlanmasına bağlı olarak ).

join()indeks temelinde 2 veri çerçevesini birleştirmek için kullanılır; merge()seçeneğiyle kullanmak yerine left_index=Truekullanabileceğimiz join().

Örneğin:

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2

Yani bu, tartışmanın işe yaradığı ve howiçinde mergeolduğundan tamamen farklı bir anlama geldiği anlamına concatmı geliyor ?
Hemanth Bakaya

11

pd.concatIterableargüman olarak bir alır . Bu nedenle, DataFrames'yi doğrudan argüman olarak alamaz . Ayrıca Dimensionbir s DataFramebirleştirerek ederken eksen boyunca aynı olmalıdır.

pd.mergeDataFrameargüman olarak s alabilir ve iki DataFrames'yi aynı sütun veya indeksle birleştirmek için kullanılır ; pd.concatbu, DataFrame'de tekrarlanan sütunu göstereceğinden bu yapılamaz.

Join DataFrameise farklı endekslerle iki s'yi birleştirmek için kullanılabilir .


7
Bu yanıtı beğendim çünkü birleştirirken boyutların eşleşmesi gerektiğini belirtiyor. concatbirkaç veri çerçevesini birbirinin üstüne / yanına yapıştırmaktan başka bir şey değildir. Aynı sütunu iki kez göstereceği anlamında içerik farkında değildir. Oysa mergegerçekte olacaktır birleştirme sütunları aynı olduğunda.
jorijnsmit

3
Bunun doğru olmadığını düşünüyorum. Yukarıdaki cevap bile (@Abhishek Sawant tarafından) concatboyutların nerede eşleşmediğine dair bir örnek verir .
michcio1234

7

Şu anda pd.DataFrame.merge()ve arasındaki temel farkları anlamaya çalışıyorum pd.concat().

Güzel soru. Ana fark:

pd.concat her iki eksende de çalışır.

Diğer fark vardır pd.concatsahiptir varsayılan ve dış ederken, sadece katılır pd.DataFrame.merge()etti sola , sağa , dış , varsayılan katılır.

Üçüncü kayda değer diğer fark şudur: pd.DataFrame.merge()aynı ada sahip sütunları birleştirirken sütun son eklerini ayarlama seçeneğine sahiptir, ancak bunun için pd.concatmümkün değildir.


İle pd.concatvarsayılan olarak birden fazla dataframes (satırlarını yığını edebiliyoruz axis=0) ve belirttiğiniz zaman axis=1sonra taklit pd.DataFrame.merge()fonksiyonu.

Bazı yararlı örnekler pd.concat:

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's

6

Yüksek seviyede:

  • .concat()DataFrameindekse hizalandıktan sonra dikey olarak veya yatay olarak birden çok dikişi bir araya getirir
  • .merge()önce iki DataFrame'seçili ortak sütunu veya dizini hizalar ve sonra kalan sütunları her birinin hizalanmış satırlarından alır DataFrame.

Daha spesifik olarak .concat():

  • Üst düzey bir pandalar işlevidir
  • İki veya daha fazla pandayı DataFrame dikey veya yatay olarak birleştirir
  • Yatay olarak birleştirirken yalnızca dizinde hizalar
  • Herhangi biri DataFrameyinelenen bir dizin içerdiğinde hata verir .
  • İç birleştirme seçeneğiyle dış birleştirme varsayılanları

Ve .merge():

  • Hem üst düzey bir panda işlevi hem de bir DataFrameyöntem olarak bulunur (Pandalar 1.0'dan itibaren)
  • Tam olarak ikisini DataFrameyatay olarak birleştirir
  • Çağrı hizalar DataFrame'diğer s kolonu (ler) veya dizin DataFrames kolonu (ler) veya dizin'
  • Kolları katılmadan sütun veya endeksi değerleri çoğaltmak bir kartezyen ürünü gerçekleştirerek
  • Sol, dış ve sağ seçenekleri ile iç birleşim için varsayılanlar

Gerçekleştirirken pd.merge(left, right), leftbirleşen sütunlardan veya dizinden aynı değerleri içeren iki satır varsa , her satırın rightkarşılık gelen satır (lar) ı ile birleşerek kartezyen bir ürün elde edeceğini unutmayın . Öte yandan, .concat()sütunları birleştirmek için kullanılıyorsa, ikisinde de yinelenen dizin olmadığından emin olmamız gerekir DataFrame.

Pratik olarak konuşmak:

  • Düşünün .concat()homojen birleştiren birinci DataFramebulurken, .merge()tamamlayıcı birleştirme, birinci DataFrame.
  • Dikey olarak birleştirmeniz gerekiyorsa, ile gidin .concat(). Sütunlar aracılığıyla yatay olarak birleştirmeniz .merge()gerekirse, varsayılan olarak ortak sütunlarda birleştirilen ile devam edin.

Referans: Pandas 1.x Yemek Kitabı


2

Birleştirme ve birleştirme arasındaki temel fark, birleştirmenin, concat kullanımının daha geniş ve daha az yapılandırılmış olduğu tabloların daha yapılandırılmış "birleştirilmesini" gerçekleştirmenize izin vermesidir.

Birleştirmek

Değinen belgeleri , pd.DataFrame.mergesürer sağ bazı yapılandırılmış önceden tanımlanmış katılmak operasyon göre sol tablo ve sağ tablo katılmadan olarak düşünebiliriz gerekli bir argüman olarak. Sağdaki parametrenin tanımına dikkat edin .

Gerekli Parametreler

  • sağ : DataFrame veya adlandırılmış Seri

Opsiyonel Parametreler

  • nasıl : {'sol', 'sağ', 'dış', 'iç'} varsayılan 'iç'
  • on : etiket veya liste
  • left_on : etiket veya liste veya dizi benzeri
  • right_on : etiket veya liste veya dizi benzeri
  • left_index : bool, varsayılan Yanlış
  • right_index : bool, varsayılan Yanlış
  • sort : bool, varsayılan Yanlış
  • son ekler : tuple of (str, str), default ('_x', '_y')
  • copy : bool, varsayılan True
  • gösterge : bool veya str, varsayılan False
  • validate : str, isteğe bağlı

Önemli: pd.DataFrame.merge bir pd.DataFrameveya adlandırılmış pd.Seriesnesne olma hakkını gerektirir .

Çıktı

  • Verir : DataFrame

Ayrıca, pandalarda Birleştirme İşlemi için belge dizisini kontrol edersek aşağıdadır:

Anahtar olarak sütunları veya satır dizinlerini kullanarak iki DataFrame veya Series nesnesi arasında veritabanı (SQL) birleştirme işlemi gerçekleştirin

Concat

Bakınız belgelere ait pd.concatparametre herhangi adlandırılmış olmadığını ilk notta, masa, data_frame, dizi matris vb ama OBJS yerine. Yani, şu şekilde tanımlanan birçok "veri taşıyıcısı" nı geçirebilirsiniz:

Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]

Gerekli Parametreler

  • objs : Series veya DataFrame nesnelerinin dizisi veya eşlemesi

Opsiyonel Parametreler

  • eksen : {0 / "dizin", 1 / "sütun"}, varsayılan 0
  • birleşim : {'iç', 'dış'}, varsayılan 'dış'
  • ignore_index : bool, varsayılan False
  • tuşlar : sıra, varsayılan Yok
  • düzeyler : dizi listesi, varsayılan Yok
  • adlar : liste, varsayılan Yok
  • valid_integrity : bool, varsayılan Yanlış
  • sort : bool, varsayılan Yanlış
  • copy : bool, varsayılan True

Çıktı

  • Döndürür : nesne, nesne türü

Misal

Kod

import pandas as pd

v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])

df_left = pd.DataFrame({
    "v1": v1,
    "v2": v2,
    "v3": v3
    })
df_right = pd.DataFrame({
    "v4": [5, 5, 5, 5],
    "v5": [3, 2, 1, 0]
    })


df_concat = pd.concat([v1, v2, v3])

# Performing operations on default

merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)

Kod Çıkışı

   v1     v2  v3  v4  v5
0   1     10   0   5   3
1   5    100   1   5   2
2   9   1000   2   5   1
3  13  10000   3   5   0
====================
     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0

Bununla birlikte, eksen parametresini değiştirerek ilk çıktıyı (birleştirme) concat ile elde edebilirsiniz.

concat_result = pd.concat([df_left, df_right], sort=False, axis=1)

Aşağıdaki davranışı gözlemleyin,

concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)

çıktılar;

     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0

, yalnızca tek bir DataFrame'e veya adlandırılmış Serilere izin verdiği için birleştirme ile benzer bir işlem gerçekleştiremezsiniz.

merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)

çıktılar;

TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed

Sonuç

Zaten fark etmiş olabileceğiniz gibi, giriş ve çıkışlar "birleştirme" ve "birleştirme" arasında farklı olabilir.

Başlangıçta bahsettiğim gibi, ilk (ana) fark, "birleştirme" nin sınırlı nesne ve parametreler kümesi ile daha yapılandırılmış bir birleştirme gerçekleştirmesidir; burada "concat", daha geniş bir kümeyle daha az katı / daha geniş bir birleştirme gerçekleştirir nesnelerin ve parametrelerin.

Sonuç olarak, birleştirme / (giriş) değişikliklerine daha az toleranslıdır ve "concat", değişikliklere / (girişe) daha gevşek / daha az duyarlıdır. "Concat" kullanarak "birleştirme" elde edebilirsiniz, ancak bunun tersi her zaman doğru değildir.

"Birleştirme" işlemi Veri Çerçevesi sütunlarını (veya pd.Seriesnesnenin adını ) veya satır indekslerini kullanır ve bu varlıkları kullandığından yalnızca Veri Çerçevelerinin veya Serilerinin yatay birleştirmesini gerçekleştirir ve sonuç olarak dikey işlemi uygulamaz.

Daha fazlasını görmek istiyorsanız, kaynak kodunu biraz derinlemesine inceleyebilirsiniz;


0

Yalnızca concat işlevinin eksen parametresi vardır. Birleştirme, veri çerçevelerini paylaşılan sütunlardaki değerlere göre yan yana birleştirmek için kullanılır, böylece eksen parametresine gerek kalmaz.


-2

varsayılan olarak:
birleştirme, sütun bazlı bir sol birleştirmedir
pd.merge, sütun bazlı bir iç birleştirmedir
pd.concat, satır bazında bir dış birleştirmedir

pd.concat: Yinelenebilir
argümanlar alır. Bu nedenle, DataFrame'leri doğrudan alamaz ([df, df2] kullanın)
DataFrame'in boyutları eksen boyunca eşleşmelidir

Join ve pd.merge:
DataFrame argümanlarını alabilir

Aşağıdaki kodun neden aynı şeyi yaptığını anlamak için resme tıklayın

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.