【问题标题】:Find a row matching multiple column criteria查找匹配多个列条件的行
【发布时间】:2020-02-25 23:36:42
【问题描述】:

我有一个包含 2M 行的数据框,格式如下:

ID   Number
1    30
1    40
1    60
2    10
2    30
3    60

我需要选择编号为 30 和 40 的 ID(在这种情况下,输出应为 1)。

我知道我们可以创建一个只有数字 30 和 40 的新 DF,然后使用 groupby 来查看哪些 ID 的数量超过 1。但是有没有办法在 groupby 语句中同时执行这两个操作?

我的代码:

a=df[(df['Number']==30) | (df['Number']==40) ]
b=a.groupby('ID')['Number'].nunique().to_frame(name='tt').reset_index()
b[b['tt'] > 1]

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    使用 groupby filterissubset

    s = {30, 40}
    df.groupby('ID').filter(lambda x: s.issubset(set(x.Number)))
    
    Out[158]:
       ID  Number
    0   1      30
    1   1      40
    2   1      60
    

    【讨论】:

    • 快速简单!谢谢!
    【解决方案2】:

    我发现 Groupby 对象的 describe() 方法返回一个数据框非常有用。

    temp1 = a.groupby("ID").describe()temp2 = a.groupby("ID").describe()["Number"] 输出到 Jupyter 笔记本以查看它们的外观,然后以下代码(继承自您的代码)应该是有意义的。

    summary = a.groupby("ID").describe()["Number"]
    summary.loc[summary["count"] > 1].index
    

    【讨论】:

    • 是的,我检查过了,这行得通。但是确实需要更多时间。
    【解决方案3】:

    我会为每个条件创建一个 df,然后在内部加入它们:

    df1 = df[df.Number == 30][['Number']]
    df2 = df[df.Number == 40][['Number']]
    
    df3 = df1.join(df2,how='inner',on='Number')
    

    【讨论】:

    • 是的,我所做的是类似的。我想知道我们是否可以通过 groupby 或不创建额外的 dfs 来完成这一切。
    • 当我逐字尝试您的代码时,我得到“AttributeError: module 'pandas' has no attribute 'join'”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多