在Python中使用熊猫对过滤的数据应用过滤器

时间:2019-01-16 16:20:53

标签: python python-3.x pandas filter filtering

我有一个熊猫数据框,我想以一种尚未发现的方式在过滤器之后应用过滤器。为了提供更多的上下文,A列是不同IP的占位符,而B列是公司ID的占位符。我希望第一个过滤器查看IP存在多少次。如果IP仅存在一次,或者IP存在3次以上,则应排除行。这部分,我设法解决了。问题是,现在,我希望数据库中保留的每个IP都至少可以访问2个不同的公司。该代码发布在下面,之后将有输出和预期输出。

import pandas as pd

df = pd.DataFrame({'A': ['001', '001', '002', '003', '003', '003', '003', '004', '004'],
                   'B': ['firm_a', 'firm_a', 'firm_b', 'firm_a', 'firm_c', 'firm_d', 'firm_a', 'firm_a', 'firm_b']},
                  index=[0, 1, 2, 3, 4, 5, 6, 7, 8])

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

print(df)

当前输出:

     A       B
0  001  firm_a
1  001  firm_a
7  004  firm_a
8  004  firm_b

现在,我要实现第二个过滤器,该过滤器检查IP是否访问了至少两个不同的公司。在提供的示例中,预期输出如下:

     A       B
7  004  firm_a
8  004  firm_b

如您所见,IP 001被删除是因为它通过了第一个过滤器(访问了2个或更多的公司),但是访问了同一公司并被淘汰了。我不知道如何实现第二部分。我尝试环顾四周,尽管那里有很多关于过滤的熊猫教程,但我找不到适合我问题的东西。是的,我可以在python中通过将每个IP分开并获得访问的公司的列表,消除重复项并查看列表的长度是否大于1来进行计算,这在计算上非常昂贵。我有将近10亿行,这样做会花费太多时间。有什么聪明的方法可以设置它?

1 个答案:

答案 0 :(得分:1)

您可以将groupbytransformnunique一起使用:

res = df[df.groupby('A')['B'].transform('nunique') >= 2]

print(res)

   A       B
7  4  firm_a
8  4  firm_b