Python Pandas hanya menggabungkan kolom tertentu

109

Apakah mungkin untuk hanya menggabungkan beberapa kolom? Saya memiliki DataFrame df1 dengan kolom x, y, z, dan df2 dengan kolom x, a, b, c, d, e, f, dll.

Saya ingin menggabungkan dua DataFrames pada x, tetapi saya hanya ingin menggabungkan kolom df2.a, df2.b - bukan seluruh DataFrame.

Hasilnya akan menjadi DataFrame dengan x, y, z, a, b.

Saya bisa menggabungkan lalu menghapus kolom yang tidak diinginkan, tetapi sepertinya ada metode yang lebih baik.

BubbleGuppies
sumber
1
Andy: Astaga itu mudah ... Aku butuh istirahat, aku jelas membuat ini terlalu rumit. Terima kasih atas kejelasannya!
BubbleGuppies

Jawaban:

81

Anda dapat menggabungkan sub-DataFrame (hanya dengan kolom tersebut):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])
Andy Hayden
sumber
6
Hmmm, saya ingin tahu apakah harus ada cara asli untuk melakukan ini, seperti subset di dropna ... akan mengumpulkan masalah github
Andy Hayden
Hmmm ... Saya mencoba menggunakan ini untuk menggabungkan kolom 'Unique_External_Users' dari df2 ke df1 tetapi mendapat kesalahan ... "Tidak ada [Indeks (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] ada di [kolom] ".
CoolDocMan
Ini kodenya. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan
1
@ CoolDocMan Saya pikir Anda melewatkan sesuatu dari jawaban yang diusulkan: list('xab')mengambil setiap elemen (huruf) dari string 'xab' dan mengubahnya menjadi elemen daftar sehingga list('xab')kembali ['x', 'a', 'b']. Itu berfungsi jika setiap kolom memiliki satu huruf sebagai nama. Dalam kasus Anda, saya pikir Anda perlu melakukan df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Kemungkinan besar Anda sudah menyelesaikannya sekarang, tinggalkan ini untuk pemula, seperti saya
SOf_PUAR
114

Anda ingin menggunakan DUA tanda kurung, jadi jika Anda melakukan tindakan VLOOKUP:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Ini akan memberi Anda semua di df asli + tambahkan satu kolom yang sesuai di df2 yang ingin Anda gabungkan.

Arthur D. Howland
sumber
11

Jika Anda ingin melepaskan kolom dari frame data target, tetapi kolom diperlukan untuk gabungan, Anda dapat melakukan hal berikut:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

Bagian tersebut .drop('key1')akan mencegah 'key1' disimpan dalam bingkai data yang dihasilkan, meskipun itu diharuskan untuk bergabung di tempat pertama.

tonneofash
sumber
4
Saya mendapatkan error berikut jika saya mencoba ini:KeyError: "['key1'] not found in axis"
Tanya Branagan
3
coba .drop (kolom = ['key1'])
psangam
Atau .drop ('key1', axis = 1)
tonneofash
8

Kamu bisa memakai .loc untuk memilih kolom tertentu dengan semua baris dan kemudian menariknya. Contohnya di bawah ini:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

Dalam contoh ini, Anda menggabungkan dataframe1 dan dataframe2. Anda telah memilih untuk melakukan gabungan kiri luar pada 'kunci'. Namun, untuk dataframe2 Anda telah menentukan .ilocyang memungkinkan Anda untuk menentukan baris dan kolom yang Anda inginkan dalam format numerik. Menggunakan :, Anda memilih semua baris, tetapi [0:5]memilih 5 kolom pertama. Anda bisa menggunakan .locuntuk menentukan dengan nama, tapi jika Anda berurusan dengan nama kolom yang panjang, .ilocmungkin lebih baik.

Terrance DeJesus
sumber
1
Berhati-hatilah karena .locakan membuat salinan , dan pada df besar itu bisa menyakitkan. Mungkin lebih baik untuk menggabungkan lalu segera mengambil potongan kolom dalam ekspresi yang sama.
smci
7

Ini untuk menggabungkan kolom yang dipilih dari dua tabel.

Jika table_1berisi t1_a,t1_b,t1_c..,id,..t1_zkolom, dan table_2berisi t2_a, t2_b, t2_c..., id,..t2_zkolom, dan hanya t1_a, id, t2_a yang diperlukan di tabel akhir, maka

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Marco167
sumber