使用Python和Pandas合并无唯一索引的DataFrame
解决Pandas按多字段合并DataFrame的问题
嘿,这事儿我门儿清!你需要的就是用Pandas的merge()方法,按food和campus两个字段做精准匹配,把学生和教师的评分表合并到一起,同时保留所有存在的记录,没匹配到的评分列自动填充NaN,完全符合你给出的示例效果。
完整实现代码
import pandas as pd # 初始化学生评分数据 student_ratings = pd.DataFrame({ 'food': ['chinese', 'mexican', 'american', 'chinese', 'mexican', 'american'], 'campus': [37, 37, 37, 25, 25, 25], 'student_rating': [97, 90, 83, 96, 89, 82] }) # 初始化教师评分数据 teacher_ratings = pd.DataFrame({ 'food': ['chinese', 'mexican', 'american', 'chinese', 'mexican', 'american', 'chinese', 'mexican', 'american'], 'campus': [25, 25, 25, 37, 37, 37, 45, 45, 45], 'teacher_rating': [87, 80, 73, 86, 79, 72, 67, 62, 65] }) # 核心合并操作:按food和campus匹配,保留所有记录 combined_ratings = pd.merge( teacher_ratings, student_ratings, on=['food', 'campus'], how='outer' ) # 调整列顺序,和示例输出保持一致(可选) combined_ratings = combined_ratings[['food', 'campus', 'student_rating', 'teacher_rating']] # 打印结果 print(combined_ratings)
关键参数说明
on=['food', 'campus']:指定这两个字段作为匹配的主键,只有当两个DataFrame里的这两个字段值完全相同时,才会将对应的评分行合并到一起。how='outer':使用外连接模式,会保留两个DataFrame中的所有行——不管是学生表有的、教师表没有的,还是教师表有的、学生表没有的,没匹配到的列都会自动填充NaN(注意Pandas里是np.nan,你示例里写的Nan是笔误,正确写法是NaN)。- 调整列顺序的步骤是可选的,如果你不介意列的先后顺序,可以直接跳过这一步。
结果验证
运行代码后得到的combined_ratings和你给出的示例完全一致:45校区的餐食没有学生评分,所以student_rating列都是NaN,其他匹配到的校区餐食都正确填充了对应的学生评分。
要是你只想保留某一个表的所有行(比如只保留教师表的所有记录),可以把how='outer'改成how='left'(以教师表为左表),这样就只会保留教师表的所有行,学生表中没有匹配的记录就不会被加入。
内容的提问来源于stack exchange,提问作者Layne
相关产品推荐
相关产品推荐

