python - 从 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)
但什么也没发生。请指导我如何解决这个问题。
解决方案
你可以这样做:
s = (df['Item'].isin(item_list)
.groupby([df['InvoiceNo'], df['CategoryNo']])
.transform('any')
)
df[s]
推荐阅读
- xamarin.forms - 多个 Dotfuscator 构建警告 Xamarin:SetStateMachine & MoveNext
- vba - 创建数据透视表以包含 xlSum 数字格式的小数
- r - 结合 grep 和 if else 语句
- asp.net-mvc - Visual Studio 2017 中 MVC 表单中数据库的自动增量数据
- javascript - 在 Express 项目中使用 ES6/标签时出现语法错误/转换错误
- glassfish-3 - 如何在 GlassFish 3.1 Server 中禁用 HTTP 方法(OPTIONS、HEAD、...)
- python - PyQt:有没有更好的方法在代码中设置 objectName?
- c++ - c++ 对堆对象的引用?
- swift - 等待任务从另一个对象(类)完成
- c# - Windows 桌面 C# 应用程序和应用程序之间有什么区别?