Python pandas-使用多个字符串比较不同数据帧的两列
我对pandas很陌生,有个任务要求我比较和匹配两列不同的.csv文件。 数据类型是字符串 第一个dfPython pandas-使用多个字符串比较不同数据帧的两列,python,pandas,dataframe,Python,Pandas,Dataframe,我对pandas很陌生,有个任务要求我比较和匹配两列不同的.csv文件。 数据类型是字符串 第一个df 姓名|受试者 学生1 |生物、数学、德语 学生2 |体育、生物、英语 学生3 |化学、数学、生物 第二个df 姓名|受试者 教师1 |生物、体育、英语 教师2 |化学、数学、物理 教师3 |生物、物理、化学、英语 现在,我应该比较并找出学生和老师之间的最佳匹配。 也就是说,他们应该至少匹配一个主题,但要“完美匹配”所有主题 我已经尝试了不同的方法——pd.merge、iterrows、isi
姓名|受试者
学生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
然后使用pandaswide\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
然后使用pandaswide\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!几个问题:你说的“最佳匹配”是什么意思?一定要有精确的匹配吗?主题的顺序重要吗?回答问题