Gabungkan dua kerangka data dengan indeks

161

Hai, saya memiliki kerangka data berikut:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

Bagaimana cara menggabungkan indeks untuk mendapatkan:

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

Saya bertanya karena ini adalah pemahaman saya merge()yaitu df1.merge(df2)menggunakan kolom untuk melakukan pencocokan. Bahkan, melakukan ini saya dapatkan:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

Apakah praktik yang buruk untuk menggabungkan pada indeks? Apakah itu tidak mungkin? Jika demikian, bagaimana saya bisa menggeser indeks ke kolom baru yang disebut "indeks"?

Terima kasih

brucezepplin
sumber
3
coba ini:df1.join(df2)
MaxU
Bagaimana jika Anda ingin bergabung dengan indeks satu kerangka data dan kolom kerangka data kedua. (Dataframe kedua saya memiliki kolom yang cocok dengan indeces di df pertama.)
mikey

Jawaban:

322

Gunakan merge, yang merupakan gabungan internal:

pd.merge(df1, df2, left_index=True, right_index=True)

Atau join, yang dibiarkan bergabung secara default:

df1.join(df2)

Atau concat, yang merupakan join luar secara default:

pd.concat([df1, df2], axis=1)

Sampel :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0
jezrael
sumber
2
bagus. untuk orang lain yang membaca ini, jika tidak berfungsi, lihat apakah Anda perlu .transpose()salah satu dfs Anda untuk menyinkronkan indeks - itu masalah saya
Jona
2
Terima kasih banyak. Jawaban yang bagus Tapi mengapa concatharus meletakkan df di kurung sementara joindan mergetidak?
Bowen Liu
@Bowen Liu Menurut pendapat saya untuk kemungkinan beberapa DataFrames dalam daftar seperti dfs = [df1, df2, df3,... dfn]dan kemudiandf = pd. concat(dfs)
jezrael
@jezrael Bisakah Anda memeriksa pertanyaan baru saya di stackoverflow.com/questions/57133848/…
Msquare
29

Anda dapat menggunakan concat ([df1, df2, ...], axis = 1) untuk menggabungkan dua atau lebih DF yang selaras dengan indeks:

pd.concat([df1, df2, df3, ...], axis=1)

atau digabung untuk digabungkan dengan bidang / indeks khusus:

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

atau bergabung untuk bergabung dengan indeks:

 df1.join(df2)
MaxU
sumber
6

Secara default:
joinadalah join kiri kolom-bijaksana
pd.mergeadalah join dalam kolom-bijaksana
pd.concatadalah join luar bijaksana-baris

pd.concat:
mengambil argumen yang dapat diterima. Dengan demikian, itu tidak dapat mengambil DataFrames secara langsung (menggunakan [df,df2])
Dimensi DataFrame harus cocok dengan sumbu

Joindan pd.merge:
dapat mengambil argumen DataFrame

vicpal
sumber
5

Bug konyol yang membuat saya: gabungan gagal karena indeks dtypesberbeda. Ini tidak jelas karena kedua tabel adalah tabel pivot dari tabel asli yang sama. Setelah itu reset_index, indeks-indeks itu terlihat identik di Jupyter. Itu hanya terungkap saat menyimpan ke Excel ...

Diperbaiki dengan: df1[['key']] = df1[['key']].apply(pd.to_numeric)

Semoga ini menyelamatkan seseorang satu jam!

Stephen Morrell
sumber
4

Jika Anda ingin bergabung dengan dua dataframe dalam panda, Anda cukup menggunakan atribut yang tersedia seperti mergeatau concatenate. Misalnya jika saya memiliki dua kerangka data df1dan df2saya dapat bergabung dengan:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
vignesh babu
sumber