Tambahkan kolom ke bingkai data panda

104

Ini mungkin mudah, tetapi saya memiliki data berikut:

Dalam bingkai data 1:

index dat1
0     9
1     5

Dalam bingkai data 2:

index dat2
0     7
1     6

Saya ingin bingkai data dengan bentuk berikut:

index dat1  dat2
0     9     7
1     5     6

Saya sudah mencoba menggunakan appendmetode ini, tetapi saya mendapatkan gabungan silang (yaitu produk cartesian).

Apa cara yang benar untuk melakukan ini?

BenDundee
sumber
2
Apakah Anda sudah mencoba joinmetode ini?
BrenBarn
1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech
@lowtech: apakah itu memastikan bahwa indeks dipasangkan dengan benar?
BenDundee
@ BenDundee: ya itu benar
lowtech

Jawaban:

132

Sepertinya secara umum Anda hanya mencari yang bergabung:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6
U2EF1
sumber
45
Atau pd.concat([dat1, dat2], axis=1)dalam kasus ini.
DSM
2
@BenDundee Bergabung dan concat menggunakan banyak kode yang sama di bawah tenda, jadi cara yang "benar" mungkin hanya penting ketika Anda mempertimbangkan kasus edge. Misalnya di sini jika kedua DataFrames memiliki kolom 'data', gabungan akan gagal , sedangkan concat akan memberi Anda dua kolom bernama 'data'.
U2EF1
@ U2EF1: Saya berbicara tentang tanggapan Anda vs. tanggapan saya. Selalu ada N cara untuk menguliti kucing :)
BenDundee
@Ben, aku mengerti. Metode itu membuang indeks unik dan memiliki efek samping yang lebih aneh dalam kasus yang lebih rumit. Misalnya jika saya memiliki dua kolom bernama 'data', pengelompokan / penjumlahan akan mulai merangkum kolom data yang berbeda, yang hampir pasti bukan yang Anda inginkan. Data string akan digabungkan.
U2EF1
1
Seperti yang ditunjukkan oleh @ jeremy-z, sangat penting untuk menyetel ulang indeks di kedua kumpulan data jika keduanya tidak berbagi indeks yang sama. Jika tidak, Anda akan mendapatkan satu set data dengan banyak baris NaN.
Israel Varea
57

Anda juga bisa menggunakan:

dat1 = pd.concat([dat1, dat2], axis=1)
Ella Cohen
sumber
1
Jika Anda menemui InvalidIndexError: Reindexing only valid with uniquely valued Index objects , Anda dapat menggunakan:pd.concat([dat1.reset_index(), dat2], axis=1)
Beyondfloatingpoint
40

Keduanya join()dan concat()cara bisa memecahkan masalah. Namun, ada satu peringatan yang harus saya sampaikan : Atur ulang indeks sebelum Anda join()atau concat()jika Anda mencoba menangani beberapa bingkai data dengan memilih beberapa baris dari DataFrame lain.

Salah satu contoh di bawah ini menunjukkan beberapa perilaku menarik dari join dan concat:

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
Jeremy Z
sumber
Kata-kata bagus dan poin bagus. Saya mencoba tanpa mengatur ulang indeks dan menghasilkan banyak NULLS
Anand
Tanpa melakukan langkah reset, data saya terlihat bagus dan bagus, tetapi jelas ada sesuatu yang tidak berfungsi dengan baik di belakang layar. Terima kasih telah menunjukkannya! Penyetelan ulang membuat model saya aktif dan berjalan!
Ionuț Ciuta
Ini harus menjadi jawaban yang diterima! Itu selalu menghasilkan NaN jika kita tidak mengatur ulang indeks.
Srivatsan
Langkah ini menyelamatkan saya. Saya mencoba memahami mengapa concat dan join menghasilkan banyak NaN. Terima kasih telah membagikan ini.
Gustavo Rottgering
0

Faktanya:

data_joined = dat1.join(dat2)
print(data_joined)
Raj Stha
sumber
-3

Hanya masalah pencarian google yang benar:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
BenDundee
sumber