You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:42:01