【问题标题】:Applying filters on filtered data with pandas in Python [duplicate]在Python中使用pandas对过滤后的数据应用过滤器[重复]
【发布时间】:2019-06-10 18:50:30
【问题描述】:

我有一个 pandas 数据框,我想以我尚未发现的方式在过滤器之后应用过滤器。为了提供更多上下文,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 是否访问了至少 2 个不同的公司。在提供的示例中,预期输出如下:

     A       B
7  004  firm_a
8  004  firm_b

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用groupby + transformnunique

    res = df[df.groupby('A')['B'].transform('nunique') >= 2]
    
    print(res)
    
       A       B
    7  4  firm_a
    8  4  firm_b
    

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 2023-01-02
      • 2020-11-06
      • 2013-09-29
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多