如何在Pandas中仅保留含多个商品的销售订单记录列表
解决你的Pandas订单过滤需求
你已经完成了核心逻辑的搭建,现在只需要加一步简单的过滤——把那些仅含单个商品的订单标记为[REMOVED]即可。核心思路是在分组生成订单列表时,判断每个s_id对应的商品数量(也就是i_id列表的长度),只有长度大于1的才保留原列表,否则替换成你需要的标记。
这里是修改后的完整代码:
import pandas as pd d = {'s_id': [1, 2, 2, 2, 3, 4, 4, 4, 5, 5], 'i_id': [1, 1, 2, 3, 1, 4, 1, 2, 3, 5]} df = pd.DataFrame(data=d) print(df) numers_i = df.i_id.unique().tolist() for i in numers_i: buyers = df[df.i_id.eq(i)].s_id.unique() df_new = df[df.s_id.isin(buyers)] # 关键修改:对每个分组的i_id列表做长度判断 list_new = df_new.groupby("s_id")['i_id'].apply(lambda x: list(x) if len(x) > 1 else '[REMOVED]').tolist() print(list_new)
关键修改说明
原来的代码直接把每个分组转换成列表,现在用lambda表达式增加了判断逻辑:
- 如果当前
s_id对应的i_id数量(列表长度)大于1,就保留原列表 - 否则返回
'[REMOVED]'作为占位标记
运行这段代码后,输出会和你的期望完全一致:
s_id i_id 0 1 1 1 2 1 2 2 2 3 2 3 4 3 1 5 4 4 6 4 1 7 4 2 8 5 3 9 5 5 ['[REMOVED]', [1, 2, 3], '[REMOVED]', [4, 1, 2]] [[1, 2, 3], [4, 1, 2]] [[1, 2, 3], [3, 5]] [[4, 1, 2]] [[3, 5]]
如果你不想保留占位标记,而是直接移除这些单个商品的订单,只需要把生成list_new的代码改成这样:
list_new = [list(group) for _, group in df_new.groupby("s_id")['i_id'] if len(group) > 1]
内容的提问来源于stack exchange,提问作者Ella




