合并具有特定条件的数据帧

时间:2017-07-23 10:06:05

标签: python pandas numpy join dataframe

我有两个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中犯了错误。这样在某些情况下只有前几个字符与第一个数据帧匹配。

我希望得到一个统一的数据框,如下所示: enter image description here

enter image description here

这方面的任何线索?

1 个答案:

答案 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