Hợp nhất hai datafram theo chỉ mục


161

Xin chào, tôi có các tệp dữ liệu sau:

> 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

Làm cách nào để hợp nhất các chỉ mục để nhận:

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

Tôi hỏi bởi vì đó là sự hiểu biết của tôi, merge()tức là df1.merge(df2)sử dụng các cột để thực hiện khớp. Trong thực tế, làm điều này tôi nhận được:

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

Có phải thực tế xấu để hợp nhất trên chỉ mục? Nó là bất khả thi? Nếu vậy, làm thế nào tôi có thể chuyển chỉ mục sang một cột mới gọi là "chỉ mục"?

Cảm ơn


3
thử cái này:df1.join(df2)
MaxU 7/11/2016

Điều gì xảy ra nếu bạn muốn tham gia theo chỉ mục của một khung dữ liệu và một cột của khung dữ liệu thứ hai. (Khung dữ liệu thứ hai của tôi có một cột khớp với các phân trong df đầu tiên.)
mikey

Câu trả lời:


322

Sử dụng merge, đó là tham gia bên trong theo mặc định:

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

Hoặc join, được để lại tham gia theo mặc định:

df1.join(df2)

Hoặc concat, đó là tham gia bên ngoài theo mặc định:

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

Các mẫu :

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

2
đẹp. đối với những người khác đọc nó, nếu nó không hoạt động, hãy xem bạn có cần .transpose()một trong các dfs của bạn để đồng bộ hóa các chỉ mục không - đó là vấn đề của tôi
Jona

2
Cảm ơn rất nhiều. Câu trả lời chính xác. Nhưng tại sao concatphải đặt df trong ngoặc joinmergekhông?
Bowen Liu

@Bowen Liu Theo ý kiến ​​của tôi về khả năng kết hợp nhiều DataFrames trong danh sách như thế dfs = [df1, df2, df3,... dfn]và sau đódf = pd. concat(dfs)
jezrael

@jezrael Bạn có thể vui lòng kiểm tra câu hỏi mới của tôi tại stackoverflow.com/questions/57133848/iêu
Msapes

29

bạn có thể sử dụng concat ([df1, df2, ...], angle = 1) để ghép hai hoặc nhiều DF được căn chỉnh theo chỉ mục:

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

hoặc hợp nhất để nối bởi các trường / chỉ mục tùy chỉnh:

# 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)

hoặc tham gia để tham gia theo chỉ mục:

 df1.join(df2)

6

Theo mặc định:
jointham gia bên trái theo
pd.mergecột
pd.concatlà tham gia bên trong theo cột là tham gia bên ngoài theo hàng

pd.concat:
mất các đối số lặp. Do đó, không thể lấy DataFrames trực tiếp (sử dụng [df,df2])
Kích thước của DataFrame phải khớp với trục

Joinpd.merge:
có thể lấy đối số DataFrame


5

Một lỗi ngớ ngẩn khiến tôi: tham gia thất bại vì chỉ số dtypeskhác nhau. Điều này không rõ ràng vì cả hai bảng đều là các bảng trụ của cùng một bảng gốc. Sau đó reset_index, các chỉ số trông giống hệt nhau trong Jupyter. Nó chỉ được đưa ra ánh sáng khi lưu vào Excel ...

Đã sửa với: df1[['key']] = df1[['key']].apply(pd.to_numeric)

Hy vọng điều này sẽ giúp ai đó tiết kiệm được một giờ!


4

Nếu bạn muốn tham gia hai dataframes trong gấu trúc, bạn chỉ cần sử dụng các thuộc tính có sẵn như mergehoặc concatenate. Ví dụ: nếu tôi có hai datafram df1df2tôi có thể tham gia chúng bằng cách:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.