2016-03-01 22 views
6

Bu biraz açıklamak zor ama elimden geleni yapacağım. Şu anda sahip olduğum şey bir araya gelmem gereken iki tablo, ama gerçekten benzersiz bir katılma kimliğine sahip değiliz. Yapabileceğim en iyi iki sütun var. Yapabileceğim en iyi şey, ve sadece birleşimin her iki tarafında eşit sayıya sahip olmadığımızı bilmek istiyorum. Şu anda, eğer sağ tablonun sol tablodaki 2 girdiyle 1 eşleşmesi varsa, o 1 maçı her iki girişe de katılır. Bu bana doğru tabloyu bilmeme neden oluyor, sadece solda 2'ye karşı 1 giriş var.Pandalar değiştirilmeden birleştirir

İstediğim şey sağdaki tabloyu sola (dış) birleştirmek ama sağdaki tabloya giriş başına birden çok kez katılmak istemiyorum. Yani eğer sağdaki tablo indeksi 3, sol taraftaki indeks 1 ve 2'de birleştirilebilseydi, sadece indeks 1'de birleştirilmesini istiyorum. Ayrıca, endeks 3 ve dizin 4, indeks 1 ve 2'de birleştirilebilirse, indeksi istiyorum 1 endeksi 3 ile eşleşecek ve dizin 2 ile eşleştirilecek dizin 2. Eğer sadece 1 eşleşme varsa (Index 1 -> 3), ancak sol tablodaki Index 2 indeksi 3 ile eşleştirilebilir, Index istiyorum 2 katılmamak için. Bunu en iyi tarif edebilir

Örnekler: Bu örnekte

a_df = pd.DataFrame.from_dict({1: {'match_id': 2, 'uniq_id': 1}, 2: {'match_id': 2, 'uniq_id': 2}}, orient='index') 

In [99]: a_df 
Out[99]: 
    match_id uniq_id 
1   2  1 
2   2  2 


In [100]: b_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 2, 'uniq_id': 4}}, orient='index') 

In [101]: b_df 
Out[101]: 
    match_id uniq_id 
3   2  3 
4   2  4 

, ben a_df b_df üzerine katılmak istiyorum. Şimdi

Out[106]: 
    match_id_right match_id uniq_id uniq_id_right 
1    2   2  1    3 
2    2   2  2    4 

en biz c_df için a_df katılmak istiyorum diyelim: Ben şu şekilde görünecektir 3 uniq_id a_df 2.

Çıktı a_df uniq_id 1 ve b_df 4 ile eşleştirilecek b_df istiyorum

In [104]: c_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 3, 'uniq_id': 4}}, orient='index') 

In [105]: c_df 
Out[105]: 
    match_id uniq_id 
3   2  3 
4   3  4 

Bu durumda, a_df'de 2'nin match_id'leri ve c_df'de 2'si sadece 1 eşleşme_dizimiz var. Bu durumda

Sadece

match_id_right match_id uniq_id uniq_id_right 
1    2   2  1    3 
2    NaN   2  2   NaN 
4    3  NaN  NaN    4 

cevap

1

Evet arkadaşlar eşsiz olması uniq_id 2 ve uniq_id 4 hem bırakarak uniq_id 1 uniq_id 3 ile eşleştirilecek istiyoruz, bu yüzden cevap aslında oldukça basittir.

Yapmanız gereken, her bir veri çerçevesini (sol, sağ) eşleşen sütun (lar) ile gruplamak ve sonra her grup için yeni bir sayaç sütunu eklemektir.

Şimdi dış birleştirmeyi yapın ve sayaç sütununu ekleyin, böylece 0,1 ile eşleşirsiniz, ancak sağın 2'si varsa, eşleşmez. Eğer sol sadece 0'a sahipse, sağ ile eşleşecektir, ancak sağda 0,1 ise, o zaman sağ '1' girişi uyuşmuyor!

Düzeltme: Kod isteği.

Kullanışlı bir şeyim yok, ama çok basit. Eğer varsa, diyelim ki, 2 sütun daha sonra sadece bir

left_df['Helper'] = left_df.groupby(['amount','date']).cumcount() 
right_df['RHelper'] = right_df.groupby(['amount','date']).cumcount() 

Sonra katılmak içinde Yardımcısı sütununu kullanırım, [ 'miktarı', 'tarih'] eşleşen ediyoruz.

+0

Bu örnek için kodu verir misiniz? –

İlgili konular