仅允许pandas数据帧中两列之间的一对一映射

时间:2014-05-18 03:02:55

标签: python pandas

我有两列数据帧df,每行都是不同的,一列中的一个元素可以映射到另一列中的一个或多个元素。我想过滤掉那些元素。因此,在最终的数据框中,一列中的一个元素仅映射到另一列中的唯一元素。

我正在做的是将一个列分组并计算重复项,然后删除计数大于1的行,并再次为另一列执行此操作。我想知道是否有更好,更简单的方法。

谢谢


edit1:我刚刚意识到我的解决方案是INCORRECT,删除A列中的多映射元素会减少B列中的映射数量,请考虑以下示例:

A B

1 4

1 3

2 4

1映射到3,4,因此前两行应删除,4映射到1,2。决赛桌应该是空的。但是,我的解决方案将保留最后一行。

有人能为我提供快速简单的解决方案吗?谢谢

1 个答案:

答案 0 :(得分:2)

嗯,您可以执行以下操作:

>>> df

   A  B
0  1  4
1  1  3
2  2  4
3  3  5

如果没有其他行的值为' A'您只想保留一行。没有其他行作为' B'的值。在此示例中,只有第三行符合这些条件:

>>> Aone = df.groupby('A').filter(lambda x: len(x) == 1)
>>> Bone = df.groupby('B').filter(lambda x: len(x) == 1)
>>> Aone.merge(Bone,on=['A','B'],how='inner')

    A  B
 0  3  5

说明:

>>> Aone = df.groupby('A').filter(lambda x: len(x) == 1)
>>> Aone

   A  B
2  2  4
3  3  5

上面根据列A' A'来抓取可能允许的行。单独

>>> Bone = df.groupby('B').filter(lambda x: len(x) == 1)
>>> Bone

   A  B
1  1  3
3  3  5

上面根据查看列' B'来抓取可能允许的行。单独。然后合并交集会留下只满足两个条件的行:

>>> Aone.merge(Bone,on=['A','B'],how='inner')

注意,你也可以使用groupby/transform做类似的事情。但转变往往是缓慢的,所以我没有做它作为替代。