如何批量删除包含shipped或picked_up状态的订单全部行数据
问题:如何删除包含特定状态订单的全部行?
输入数据
| order_id | status | order_date |
|---|---|---|
| ord1 | in_progress | 20221125 |
| ord1 | in_progress | 20221126 |
| ord1 | in_progress | 20221127 |
| ord1 | shipped | 20221128 |
| ord2 | in_progress | 20221127 |
| ord2 | in_progress | 20221128 |
| ord2 | in_progress | 20221129 |
| ord2 | in_progress | 20221130 |
| ord3 | in_progress | 20221126 |
| ord3 | picked_up | 20221127 |
期望输出
| order_id | status | order_date |
|---|---|---|
| ord2 | in_progress | 20221127 |
| ord2 | in_progress | 20221128 |
| ord2 | in_progress | 20221129 |
| ord2 | in_progress | 20221130 |
需求说明:删除所有曾出现shipped或picked_up状态的订单的全部行,只保留从未有这两种状态的订单数据。
解决方案
1. SQL 实现
通过子查询先定位所有包含目标状态的订单ID,再排除这些订单的所有行:
SELECT * FROM your_table_name WHERE order_id NOT IN ( SELECT DISTINCT order_id FROM your_table_name WHERE status IN ('shipped', 'picked_up') );
逻辑:先找出所有出现过shipped或picked_up的订单ID,主查询只保留不在这个列表里的订单数据。
2. Python Pandas 实现
通过分组筛选出无目标状态的订单ID,再过滤原数据:
import pandas as pd # 构造示例DataFrame(实际可通过read_csv/read_excel读取数据) df = pd.DataFrame([ ['ord1', 'in_progress', '20221125'], ['ord1', 'in_progress', '20221126'], ['ord1', 'in_progress', '20221127'], ['ord1', 'shipped', '20221128'], ['ord2', 'in_progress', '20221127'], ['ord2', 'in_progress', '20221128'], ['ord2', 'in_progress', '20221129'], ['ord2', 'in_progress', '20221130'], ['ord3', 'in_progress', '20221126'], ['ord3', 'picked_up', '20221127'] ], columns=['order_id', 'status', 'order_date']) # 筛选出从未出现shipped/picked_up的订单ID valid_orders = df.groupby('order_id').filter( lambda group: not group['status'].isin(['shipped', 'picked_up']).any() )['order_id'].unique() # 过滤得到结果 result_df = df[df['order_id'].isin(valid_orders)] print(result_df)
3. Excel 实现
- 添加辅助列(如D列),输入公式判断当前订单是否包含目标状态:
公式返回值>0表示该订单存在=COUNTIFS(A:A,A2,C:C,"shipped")+COUNTIFS(A:A,A2,C:C,"picked_up")shipped或picked_up状态。 - 筛选辅助列值为0的行,即为需要保留的数据。
内容的提问来源于stack exchange,提问作者rajesh
相关产品推荐
相关产品推荐

