Python pandas-使用多个字符串比较不同数据帧的两列

Python pandas-使用多个字符串比较不同数据帧的两列,python,pandas,dataframe,Python,Pandas,Dataframe,我对pandas很陌生,有个任务要求我比较和匹配两列不同的.csv文件。 数据类型是字符串 第一个df 姓名|受试者 学生1 |生物、数学、德语 学生2 |体育、生物、英语 学生3 |化学、数学、生物 第二个df 姓名|受试者 教师1 |生物、体育、英语 教师2 |化学、数学、物理 教师3 |生物、物理、化学、英语 现在,我应该比较并找出学生和老师之间的最佳匹配。 也就是说,他们应该至少匹配一个主题,但要“完美匹配”所有主题 我已经尝试了不同的方法——pd.merge、iterrows、isi

我对pandas很陌生,有个任务要求我比较和匹配两列不同的.csv文件。 数据类型是字符串

第一个df
姓名|受试者
学生1 |生物、数学、德语
学生2 |体育、生物、英语
学生3 |化学、数学、生物

第二个df
姓名|受试者
教师1 |生物、体育、英语
教师2 |化学、数学、物理
教师3 |生物、物理、化学、英语

现在,我应该比较并找出学生和老师之间的最佳匹配。 也就是说,他们应该至少匹配一个主题,但要“完美匹配”所有主题

我已经尝试了不同的方法——pd.merge、iterrows、isin等等——但找不到性能优异的解决方案

我不是在要求解决我的任务,而是在正确的方向上做一点小小的努力


谢谢大家!

您可以首先使用
pd.pivot_table
以主题列为轴心,然后对
student
teacher
表的
subject列进行
合并
,以根据主题关联教师和学生。

您可以首先使用
pd.pivot_table
以主题列为轴心,然后进行分析
ofpd.merge
subject
上合并
student
teacher
表格的
列,以根据科目将教师和学生联系起来。

既然你说你不想要解决方案,但想朝正确的方向推进,那么我将如何处理这个问题:

  • 以列表形式读取两个数据集。让我们给学生和老师打电话
  • e、 g

    第一行将垂直分隔符“|”替换为“,”。然后,它拆分该行并省略第一行(标题)

    然后,下一个Python命令确保每个学生都以列表的形式出现,以便于轻松转换为数据帧

    学生现在是
    [['Name','Subjects',]['Student1','Biology','Math','derman',['Student2','Sport','Biology','English',]['Student3','Chemistry','Math','Biology']

  • 学生
    教师
    转换为数据帧。数据框中的第一列将是学生/教师标识符,每个科目将有一列。某些单元格将留空,例如,如果一些学生选修多达四门课程,而其他学生选修两门课程,那么选修两门课程的学生将在他们的行中有两个空单元格。我最初猜测执行此方法将使用两个分隔符:“|”和“,”。也可以使用
    .replace()
    方法将“|”转换为“,”,只需使用一个分隔符即可

    students=pd.DataFrame(students,columns=['name','s1','s2','s3'])

  • 然后,学生成为

           name          s1        s2        s3
    0  Student1     Biology      Math    German
    1  Student2       Sport   Biology   English
    2  Student3   Chemistry      Math   Biology
    
  • 然后使用pandas
    wide\u to\u long
    方法将两个数据集更改为“long”格式。换言之,每个学生/老师每修一门课都有一行。因此,如果一个学生选修3门课,他们将有3排
  • df=pd.wide\u to\u long(学生,[“s”],i=“name”,j=“subject”)。重置索引()

    学生
    现在成为

           name  subject           s
    0  Student1        1     Biology
    1  Student2        1       Sport
    2  Student3        1   Chemistry
    3  Student1        2        Math
    4  Student2        2     Biology
    5  Student3        2        Math
    6  Student1        3      German
    7  Student2        3     English
    8  Student3        3     Biology
    
  • 合并主题上的学生和教师数据框,然后使用groupby对(学生、教师)组合进行分组,以查找每个学生的“最佳匹配”教师
  • 我将把最后一步留给您,但将继续监视此线程,以查看您是否有任何问题(您可以通过评论向我发送通知)


    如果答案对你有帮助,请随意投票/接受。

    既然你说你不想要一个解决方案,但想朝着正确的方向推进,下面我将如何解决这个问题:

  • 以列表形式读取两个数据集。让我们给学生和老师打电话
  • e、 g

    第一行将垂直分隔符“|”替换为“,”。然后,它拆分该行并省略第一行(标题)

    然后,下一个Python命令确保每个学生都以列表的形式出现,以便于轻松转换为数据帧

    学生现在是
    [['Name','Subjects',]['Student1','Biology','Math','derman',['Student2','Sport','Biology','English',]['Student3','Chemistry','Math','Biology']

  • 学生
    教师
    转换为数据帧。数据框中的第一列将是学生/教师标识符,每个科目将有一列。某些单元格将留空,例如,如果一些学生选修多达四门课程,而其他学生选修两门课程,那么选修两门课程的学生将在他们的行中有两个空单元格。我最初猜测执行此方法将使用两个分隔符:“|”和“,”。也可以使用
    .replace()
    方法将“|”转换为“,”,只需使用一个分隔符即可

    students=pd.DataFrame(students,columns=['name','s1','s2','s3'])

  • 然后,学生成为

           name          s1        s2        s3
    0  Student1     Biology      Math    German
    1  Student2       Sport   Biology   English
    2  Student3   Chemistry      Math   Biology
    
  • 然后使用pandas
    wide\u to\u long
    方法将两个数据集更改为“long”格式。换言之,每个学生/老师每修一门课都有一行。因此,如果一个学生选修3门课,他们将有3排
  • df=pd.wide\u to\u long(学生,[“s”],i=“name”,j=“subject”)。重置索引()

    学生
    现在成为

           name  subject           s
    0  Student1        1     Biology
    1  Student2        1       Sport
    2  Student3        1   Chemistry
    3  Student1        2        Math
    4  Student2        2     Biology
    5  Student3        2        Math
    6  Student1        3      German
    7  Student2        3     English
    8  Student3        3     Biology
    
  • 合并主题上的学生和教师数据框,然后使用groupby对(学生、教师)组合进行分组,以查找每个学生的“最佳匹配”教师
  • 我将把最后一步留给您,但将继续监视此线程,以查看您是否有任何问题(您可以通过评论向我发送通知)


    如果答案对您有帮助,请随时投票/接受。

    欢迎来到Stackoverflow!几个问题:你说的“最佳匹配”是什么意思?一定要有精确的匹配吗?主题的顺序重要吗?回答问题