Python如何筛选pandas DataFrame仅保留含单个商品的订单数据
问题说明
现有一个包含多列的DataFrame,列名分别为Customerid、OrderNumber、PartNumber、Description、Revenue,示例数据如下:
CustomerId OrderNumber PartNumber Description Revenue 0 6512345 1 ABC1 KitKat 2 1 6512345 1 ABC2 Chips 3 2 6512345 1 ABC3 Coke 2 3 4213124 2 GFA1 Sprite 2 4 2132142 3 FGA1 Beer 3 5 3242342 4 DCA1 Mentos 4 6 3242342 4 DCA2 Fanta 2 7 8768655 5 ABC1 KitKat 2
需求为筛选仅保留商品数为1的订单所有行,10万级数据量下需要通用自动实现方法,不可手动指定要排除的订单编号。
实现方法
以下两种方法均适用于10万+行的数据集,性能优异,输出结果和手动筛选的结果一致:
方法1:transform直接筛选(写法最简洁)
import pandas as pd sample = pd.read_excel('../data/Sample.xlsx') # 按订单号分组后统计每组行数,仅保留行数为1的分组对应行 sample = sample[sample.groupby('OrderNumber')['OrderNumber'].transform('count') == 1]
方法2:先筛选符合条件的订单号再过滤(可读性更高)
import pandas as pd sample = pd.read_excel('../data/Sample.xlsx') # 统计每个订单的商品数量 order_item_count = sample.groupby('OrderNumber').size() # 提取仅含1件商品的订单编号 single_item_order_ids = order_item_count[order_item_count == 1].index # 过滤原表仅保留对应订单数据 sample = sample[sample['OrderNumber'].isin(single_item_order_ids)]
运行后输出结果如下:
CustomerId OrderNumber PartNumber Description Revenue 3 4213124 2 GFA1 Sprite 2 4 2132142 3 FGA1 Beer 3 7 8768655 5 ABC1 KitKat 2
内容的提问来源于stack exchange,提问作者Slavisha84
相关产品推荐
相关产品推荐

