You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何依据指定条件对DataFrame重新排序并生成商户新排名

实现方案

你可以通过自定义多维度排序键的方式实现需求,完整实现代码和逻辑如下:

首先合并两个DataFrame,再按规则逐层设置排序优先级:

  1. 原始排名第1的商户优先级最高,固定排首位
  2. 其余商户中满足order_cnt >= 100且profit >= 0的优先级次之,组内按epc降序排序
  3. 不满足筛选条件的商户优先级最低,组内按原始排名升序保留原有顺序
import pandas as pd

# 构造初始排名表
df_rank = pd.DataFrame({
    'Merchant name': ['Boohoo', 'PRETTYLITTLETHING', 'ASOS US', 'PRINCESS POLLY', 'URBAN OUTFITTERS', 'KIM+ONO'],
    'original_rnk': [1, 2, 3, 4, 5, 6]
})

# 构造运营指标表
df_metric = pd.DataFrame({
    'Merchant name': ['Boohoo', 'PRETTYLITTLETHING', 'ASOS US', 'PRINCESS POLLY', 'URBAN OUTFITTERS', 'KIM+ONO'],
    'order_cnt': [200, 100, 50, 80, 120, 500],
    'profit': [30, -60, 100, 50, -20, 90],
    'epc': [0.6, -0.4, 1.0, 0.8, -0.1, 0.7]
})

# 按商户名称关联两张表
df = pd.merge(df_rank, df_metric, on='Merchant name')

# 生成三层排序键,优先级从高到低
# 排序键1:区分是否为原始第1名,是为0,否为1,保证原始第1名排最前
df['sort_key1'] = df['original_rnk'].apply(lambda x: 0 if x == 1 else 1)
# 排序键2:区分剩余商户是否满足筛选条件,满足为0,否为1,满足条件的商户排前面
df['sort_key2'] = df.apply(lambda row: 0 if (row['original_rnk'] != 1 and row['order_cnt'] >= 100 and row['profit'] >= 0) else 1, axis=1)
# 排序键3:满足条件的组按epc降序,不满足的组按原始排名升序
df['sort_key3'] = df.apply(lambda row: -row['epc'] if row['sort_key2'] == 0 else row['original_rnk'], axis=1)

# 按排序键排序后生成新排名
df = df.sort_values(by=['sort_key1', 'sort_key2', 'sort_key3']).reset_index(drop=True)
df['new_rnk'] = df.index + 1

# 输出结果
df_result = df[['Merchant name', 'new_rnk', 'original_rnk']]
print(df_result)

运行后输出结果和你的预期完全一致:

Merchant name  new_rnk  original_rnk
0              Boohoo        1             1
1             KIM+ONO        2             6
2  PRETTYLITTLETHING         3             2
3             ASOS US        4             3
4      PRINCESS POLLY        5             4
5    URBAN OUTFITTERS        6             5

内容的提问来源于stack exchange,提问作者Claire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:06:03