Pandas veri çerçevesine sütun ekle


104

Bu muhtemelen kolaydır, ancak aşağıdaki verilere sahibim:

Veri çerçevesi 1'de:

index dat1
0     9
1     5

Veri çerçevesi 2'de:

index dat2
0     7
1     6

Aşağıdaki formda bir veri çerçevesi istiyorum:

index dat1  dat2
0     9     7
1     5     6

appendYöntemi kullanmayı denedim , ancak bir çapraz birleşim elde ediyorum (yani kartezyen ürün).

Bunu yapmanın doğru yolu nedir?


2
Denediniz mi joinyöntemini?
BrenBarn

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech: Bu, endekslerin doğru şekilde eşleşmesini sağlıyor mu?
BenDundee

@BenDundee: evet öyle
lowtech

Yanıtlar:


132

Görünüşe göre genel olarak sadece bir katılım arıyorsunuz:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
Veya pd.concat([dat1, dat2], axis=1)bu durumda.
DSM

2
@BenDundee Join ve concat, başlık altında birçok aynı kodu kullanır, bu nedenle "doğru" yol muhtemelen yalnızca uç durumları göz önünde bulundurduğunuzda önemlidir. Örneğin burada, her iki DataFrame'in de bir 'veri' sütunu varsa, birleştirme başarısız olurken, bir concat size 'veri' adlı iki sütun verecektir.
U2EF1

@ U2EF1: Cevabınız ve benimki hakkında konuşuyordum. Bir kediyi
yüzmenin

@BenDundee görüyorum. Bu yöntem, benzersiz endeksi atıyor ve daha karmaşık durumlarda daha da garip yan etkilere sahip. Örneğin, 'veri' adlı iki sütunum olsaydı, gruplama / toplama farklı veri sütunlarını toplamaya başlayacaktı, ki bu neredeyse kesinlikle istediğiniz şey değil. Dize verileri birleştirilebilir.
U2EF1

1
@ Jeremy-z'nin işaret ettiği gibi, aynı dizini paylaşmıyorlarsa, her iki veri kümesindeki dizinleri sıfırlamak çok önemlidir. Aksi takdirde, çok sayıda NaNs satırı içeren bir veri kümesi alırsınız.
İsrail Varea

57

Ayrıca kullanabilirsiniz:

dat1 = pd.concat([dat1, dat2], axis=1)

1
Karşılaşmanız durumunda şunları InvalidIndexError: Reindexing only valid with uniquely valued Index objects kullanabilirsiniz:pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint

40

Hem join()ve hem de concat()yöntem sorunu çözebilir. Bununla birlikte, bahsetmem gereken bir uyarı var: Sizden önce dizini sıfırlayın join()veya concat()başka bir DataFrame'den bazı satırları seçerek bazı veri çerçeveleriyle uğraşmaya çalışıyorsanız.

Aşağıdaki bir örnek, birleştirme ve birleştirmenin bazı ilginç davranışlarını göstermektedir:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

İyi söyledin ve iyi nokta. Dizini sıfırlamadan denedim ve çok sayıda NULLS oluşturdum
Anand

Sıfırlama adımını yapmadan, verilerim iyi ve iyi görünüyordu, ancak belli ki perde arkasında bir şeyler iyi çalışmadı. Gösterdiğiniz için teşekkürler! Sıfırlama, modelimi çalıştırdı!
Ionuț Ciuta

Kabul edilen cevap bu olmalı! İndeksi sıfırlamazsak her zaman NaN üretir.
Srivatsan

Bu adım beni kurtardı. Concat ve join neden çok fazla NaN attığını anlamaya çalışıyordum. Bunu paylaştığın için teşekkürler
Gustavo Röttgering

0

Aslına bakarsan:

data_joined = dat1.join(dat2)
print(data_joined)

-3

Doğru google araması meselesi:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
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.