如何正确理解pandas dataframe merge(how,left_on,right_on)?

时间:2017-09-24 03:48:32

标签: python-3.x pandas dataframe merge

我一直试图绕过merge一段时间:

我有以下数据框:

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

感谢。

1 个答案:

答案 0 :(得分:1)

我建议您阅读文档以正确理解合并操作。通过示例对其进行了详细记录。安理会没有想到更简单的解释。 Documentation for merging

来自文档

  

left_on :左侧DataFrame中的列用作键。可以是   列名或数组的长度等于   数据帧

     

right_on :右侧DataFrame中的列用作键。可以   是长度等于长度的列名或数组   数据帧

为什么角色和学校专栏始终位于location_y?

之间

合并后的列将被排序。要检查是否在L的第二个df参数中更改了以pd.merge之前的字母开头的列名称。

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_on而不是right_onon两个参数来匹配数据框中的键。即

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

名称列旁边的角色列是什么时候?名称列旁边的学校列是什么时候?

这取决于你给出的df的优先级。如果您先指定staff_df,那么列将在staff_df后逐列连接。因此Role位于Name列旁边。相似如果您指定student_df学生将在名称列旁边。