You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动