Pandas:如何依据指定条件对DataFrame重新排序并生成商户新排名
实现方案
你可以通过自定义多维度排序键的方式实现需求,完整实现代码和逻辑如下:
首先合并两个DataFrame,再按规则逐层设置排序优先级:
- 原始排名第1的商户优先级最高,固定排首位
- 其余商户中满足
order_cnt >= 100且profit >= 0的优先级次之,组内按epc降序排序 - 不满足筛选条件的商户优先级最低,组内按原始排名升序保留原有顺序
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
相关产品推荐
相关产品推荐

