首页 > 解决方案 > 从 groupby 对象中过滤所有行

问题描述

我有一个如下所示的数据框

+-----------+------------+---------------+------+-----+-------+
| InvoiceNo | CategoryNo | Invoice Value | Item | Qty | Price |
+-----------+------------+---------------+------+-----+-------+
|         1 |          1 |            77 |  128 |   1 |    10 |
|         1 |          1 |            77 |  101 |   1 |    11 |
|         1 |          2 |            77 |  105 |   3 |    12 |
|         1 |          3 |            77 |  129 |   2 |    10 |
|         2 |          1 |            21 |  145 |   1 |     9 |
|         2 |          2 |            21 |  130 |   1 |    12 |
+-----------+------------+---------------+------+-----+-------+

我想过滤整个组,如果列表中的任何项目item_list = [128,129,130]存在于该组中,在分组后'InvoiceNo' &'CategoryNo'

我想要的输出如下

+-----------+------------+---------------+------+-----+-------+
| InvoiceNo | CategoryNo | Invoice Value | Item | Qty | Price |
+-----------+------------+---------------+------+-----+-------+
|         1 |          1 |            77 |  128 |   1 |    10 |
|         1 |          1 |            77 |  101 |   1 |    11 |
|         1 |          3 |            77 |  129 |   2 |    10 |
|         2 |          2 |            21 |  130 |   1 |    12 |
+-----------+------------+---------------+------+-----+-------+

我知道如何使用isin(). 但是,不知道该怎么做groupby()

到目前为止,我已经在下面尝试过

import pandas as pd

df = pd.read_csv('data.csv')

item_list = [128,129,130]

df.groupby(['InvoiceNo','CategoryNo'])['Item'].isin(item_list)

但什么也没发生。请指导我如何解决这个问题。

标签: pythonpandaspandas-groupby

解决方案


你可以这样做:

s = (df['Item'].isin(item_list)
       .groupby([df['InvoiceNo'], df['CategoryNo']])
       .transform('any')
    )

df[s]

推荐阅读