2017-09-24 511 views
0

我一直在試圖總結我的頭周圍merge了一會兒:如何正確理解熊貓數據框合併(how,left_on,right_on)?

我有以下dataframes:

staff_df = pd.DataFrame([{'Name': 'Kelly', 'Role': 'Director of HR', 'Location': 'State Street'}, 
         {'Name': 'Sally', 'Role': 'Course liasion', 'Location': 'Washington Avenue'}, 
         {'Name': 'James', 'Role': 'Grader', 'Location': 'Washington Avenue'}]) 
student_df = pd.DataFrame([{'Name': 'James', 'School': 'Business', 'Location': '1024 Billiard Avenue'}, 
          {'Name': 'Mike', 'School': 'Law', 'Location': 'Fraternity House #22'}, 
          {'Name': 'Sally', 'School': 'Engineering', 'Location': '512 Wilson Crescent'}]) 

我知道我可以以多種方式將它們合併不止一個:

pd.merge(staff_df, student_df, how='left', left_on='Name', right_on='Name') 
pd.merge(student_df, staff_df, how='left', left_on='Name', right_on='Name') 
pd.merge(staff_df, student_df, how='right', left_on='Name', right_on='Name') 
pd.merge(student_df, staff_df, how='right', left_on='Name', right_on='Name') 

每個產生一個稍微不同的輸出。有人能以正確的方式引導我理解每個輸出是如何構建的嗎?

具體來說,

  • 爲什麼總是location_y之間的角色和學校列?
  • 什麼時候名稱列旁邊的角色列和名稱列旁邊的學校 列是什麼時候?

我不想問在同一個合併語句中使用left_indexright_on

謝謝。

+2

你有沒有讀過https://pandas.pydata.org/pandas-docs/stable/merging.html? – Zero

+0

@Zero感謝您參考文檔。我瀏覽了它,我無法找到正確的例子來幫助我解決我的問題。如果你可以給我一些關於如何處理我的問題的指導,那將是非常感謝。謝謝。 –

回答

1

我建議您仔細閱讀文檔以正確理解合併操作。它有很好的文件記錄。本傑克沒有想到更簡單的解釋。 Documentation for merging

從技術文檔

left_on:從左邊的數據框中的列項即可使用。可以是 列名或與長度數組等於 數據幀

right_on的長度:從右側數據幀列作爲鍵來使用。可以 是列名或數組長度等於的 數據幀

長度爲什麼角色和學校列始終location_y之間?

合併後的列將被排序。檢查是否更改了第號參數df參數L之前的字母開頭的列名稱。

pd.merge(student_df, staff_df, how='left', left_on='Name', right_on='Name') 
 
      Location_x Name  School   Location_y   Role 
0 1024 Billiard Avenue James  Business Washington Avenue   Grader 
1 Fraternity House #22 Mike   Law    NaN    NaN 
2 512 Wilson Crescent Sally Engineering Washington Avenue Course liasion 

例子,如果RoleBole

 
      Location_x Name  School   Bole   Location_y 
0 1024 Billiard Avenue James  Business   Grader Washington Avenue 
1 Fraternity House #22 Mike   Law    NaN    NaN 
2 512 Wilson Crescent Sally Engineering Course liasion Washington Avenue 

代替left_onright_on兩個參數可以使用on將來自數據幀匹配的鑰匙。一世。Ë

pd.merge(student_df, staff_df, how='left', on='Name') 

當這個名字列旁邊的角色列,當這個名字列旁邊的學校列?

這取決於你給予的df的優先級。如果您首先指定staff_df,則在staff_df之後,列將逐列連接。所以Role將在Name列旁邊。相似,如果你指定student_df學生將位於姓名欄旁邊。