为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中使用 Pandas 对过滤数据应用过滤器

在 Python 中使用 Pandas 对过滤数据应用过滤器

拉风的咖菲猫 2021-10-12 16:34:41
我有一个熊猫数据框,我想以一种我尚未发现的方式在过滤器之后应用过滤器。为了提供更多上下文,A 列是不同 IP 的占位符,而 B 列是公司 ID 的占位符。我希望第一个过滤器查看 IP 出现的次数。如果 IP 仅出现一次或 IP 出现超过 3 次,则应排除这些行。这部分,我设法解决了。问题是,现在,我希望保留在数据库中的每个 IP 至少可以访问 2 个不同的公司。代码发布在下面,之后会有输出和预期输出。import pandas as pddf = 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       B0  001  firm_a1  001  firm_a7  004  firm_a8  004  firm_b现在,我想实现第二个过滤器,检查一个 IP 是否访问了至少 2 个不同的公司。在提供的示例中,预期输出如下:     A       B7  004  firm_a8  004  firm_b如您所见,IP 001 被删除,因为它通过了第一个过滤器(访问了 2 个或更多公司),但它访问了同一家公司并被淘汰。我不知道如何实现第二部分。我试着环顾四周,虽然有很多关于过滤的 Pandas 教程,但我没有找到适合我的问题的东西。虽然是的,但我可以通过将每个 IP 分开并获取访问公司的列表、消除重复项并查看列表的长度是否大于 1 来在 python 中执行此操作,这在计算上非常昂贵。我有接近 10 亿行,这样做会花费太多时间。有什么聪明的方法可以设置吗?
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您可以将groupby+transform与nunique:


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


print(res)


   A       B

7  4  firm_a

8  4  firm_b


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信