Python中利用Groupby查找订单内重复Item_ID的高效方法
嘿,这个需求我太熟悉了!要高效找出每个订单里重复出现的商品ID,我给你两种方案,其中基于pandas的实现绝对是大数据量下的最优选择,性能拉满:
最高效实现方案:Pandas(推荐)
Pandas针对表格型数据的分组统计做了大量底层优化(基于C扩展),比纯Python循环快得多,尤其是数据量上万甚至几十万行的时候,差距会非常明显。
实现步骤&代码
import pandas as pd # 1. 构造数据集(如果是从CSV/Excel读取,直接用pd.read_csv/pd.read_excel即可) order_data = [ [101, 121], [101, 121], [101, 223], [101, 234] ] df = pd.DataFrame(order_data, columns=["Order_ID", "Item_ID"]) # 2. 分组统计每个(订单ID, 商品ID)的出现频率 freq_df = df.groupby(["Order_ID", "Item_ID"]).size().reset_index(name="freq") # 3. 筛选出频率大于1的记录 result = freq_df[freq_df["freq"] > 1] # 4. 输出你要的格式(如果需要保存到文件,把print换成to_csv的路径参数即可) print(result.to_csv(index=False, header=True))
执行后会输出:
Order_ID,Item_ID,freq 101,121,2
纯Python备选方案(小数据量适用)
如果不想引入pandas依赖,用标准库的collections模块也能实现,但性能不如pandas,适合数据量很小的场景:
from collections import defaultdict, Counter order_data = [ (101, 121), (101, 121), (101, 223), (101, 234) ] # 先按订单ID分组,收集每个订单下的所有商品ID order_item_map = defaultdict(list) for order_id, item_id in order_data: order_item_map[order_id].append(item_id) # 统计每个订单内的商品频率,筛选重复项 result_rows = [] for order_id, items in order_item_map.items(): item_counts = Counter(items) for item_id, freq in item_counts.items(): if freq > 1: result_rows.append((order_id, item_id, freq)) # 格式化输出 print("Order_ID, Item_ID, freq") for row in result_rows: print(f"{row[0]},{row[1]},{row[2]}")
总结
- 数据量小:两种方案都能用,纯Python方案不需要额外依赖
- 数据量大/追求性能:优先选Pandas方案,底层优化带来的性能提升非常显著
内容的提问来源于stack exchange,提问作者Rishab Oberoi
相关产品推荐
相关产品推荐

