Pandas与类似WHERE的条件和/或列合并

时间:2017-08-06 10:50:59

标签: python pandas join merge

我有一个Pandas数据框names,其中包含一个名称为

的列
names
A
B
C
D

我有另一个Pandas数据框results,其中包含匹配数据,其中名称可以显示在两列中,即wnamelname。此外,此数据框包含Idresult列:

id   wname  lname   result
1    A      B       X
1    B      C       Y
1    C      D       Z
2    C      D       Y
2    D      A       Y
2    A      B       Z

此外,我有一个字典pdictname数据框中的每个names都包含我感兴趣的id数据框中的results

{A: 1, B: 1, C: 2, D: 2}

我现在想合并两个数据框namesresults,如下所示:

  • 如果results列或name列中显示name,则wname的所有行都应加入相应的lname results
  • 此外,如果相应的results name列相关,则只应加入id行。这可以在pdict词典中查找。

结果应如下所示:

names   id   wname  lname   result
A       1    A      B       X
B       1    A      B       X
B       1    B      C       Y
C       2    C      D       Y
D       2    C      D       Y
D       2    D      A       Y

我想尽可能提高效率,因为我有几千个名字和结果需要合并。

我知道如何使用pd.merge加入一列。但是,如何在wnamelname列上执行此操作?我如何只加入与dict中results相关联的右侧(name)的行?

修改

感谢this,我现在知道如何在/ wnamelname列上进行联接。我的最后一个问题是在dict中查找。我可以在后处理步骤中执行此操作,但出于性能原因,如果results中不必要的行不会首先合并,我认为会好得多。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您可以根据条件选择数据,并在合并后将其存储在数据框中,即

pdict = {"A": 1, "B": 1, 'C': 2, 'D': 2}
df2['id'] = df2['names'].map(pdict)
df = df2.merge(df)
df3 = df[(df['names']==(df['wname'])) | (df['names'] ==  df['lname'])]

输出:

  names  id wname lname result
0      A   1     A     B      X
3      B   1     A     B      X
4      B   1     B     C      Y
6      C   2     C     D      Y
9      D   2     C     D      Y
10     D   2     D     A      Y

您可以使用df3 = df3.reset_index(drop=True)

重置索引

希望有所帮助