我有两个pandas数据帧。第一个包含课程ID和教师ID,第二个包含课程ID, 评级和评论。请参阅下面的示例。
第一个数据帧:
df1 = pd.DataFrame({"Course ID": ["MTH101.A", "MTH102.A", "MTH101.B", "MTH203.A", "MTH123.C"], "Instructor ID": ["X01", "T08", "C02", "D03", "Q01"]})
第二个数据框:
df2 = pd.DataFrame({"Course ID": ["MTH101.A", "MTH102.X", "MTH203.A", "MTH101.B", "MTH123.Q"], "Rating": ["3.7", "4.1", "4.7", "2.9", "3.1"], "Remarks": ['B', 'A', 'A+', 'C', 'B']})
不幸的是,数据输入人员在第二个数据帧中的课程ID中犯了错误。这样在某些情况下只有前几个字符与第一个数据帧匹配。
这方面的任何线索?
答案 0 :(得分:3)
我们可以通过匹配Course ID
合并,并附加那些没有"完全匹配":
bad1 = np.where(~df1['Course ID'].isin(df2['Course ID']))[0]
bad2 = np.where(~df2['Course ID'].isin(df1['Course ID']))[0]
r = \
df1.merge(df2) \
.append(pd.merge(df1.loc[bad1].assign(x=df1['Course ID'].str.split('\.').str[0]),
df2.loc[bad2].drop('Course ID',1).assign(x=df2['Course ID'].str.split('\.').str[0]),
on='x') \
.drop('x', 1))
结果:
In [44]: r
Out[44]:
Course ID Instructor ID Rating Remarks
0 MTH101.A X01 3.7 B
1 MTH101.B C02 2.9 C
2 MTH203.A D03 4.7 A+
0 MTH102.A T08 4.1 A
1 MTH123.C Q01 3.1 B