我有两列数据帧df,每行都是不同的,一列中的一个元素可以映射到另一列中的一个或多个元素。我想过滤掉那些元素。因此,在最终的数据框中,一列中的一个元素仅映射到另一列中的唯一元素。
我正在做的是将一个列分组并计算重复项,然后删除计数大于1的行,并再次为另一列执行此操作。我想知道是否有更好,更简单的方法。
谢谢
edit1:我刚刚意识到我的解决方案是INCORRECT,删除A列中的多映射元素会减少B列中的映射数量,请考虑以下示例:
A B
1 4
1 3
2 4
1映射到3,4,因此前两行应删除,4映射到1,2。决赛桌应该是空的。但是,我的解决方案将保留最后一行。
有人能为我提供快速简单的解决方案吗?谢谢
答案 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
做类似的事情。但转变往往是缓慢的,所以我没有做它作为替代。