2017-09-24 514 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学生将位于姓名栏旁边。