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

如何生成指定格式的餐厅推荐结果?优化Pandas实现代码

餐厅推荐结果格式转换与代码优化方案

一、如何生成目标输出格式

基于你已经得到的result数据框,只需按好友分组,为每组内的行分配从1开始的推荐排名,再筛选出需要的列即可:

# 生成目标格式结果
final_output = (
    result
    # 按好友分组,为每组分配连续的推荐排名
    .groupby('FriendName', group_keys=False)
    .apply(lambda grp: grp.assign(RecommendationRank=range(1, len(grp)+1)))
    # 保留需要的列
    [['FriendName', 'Restaurant', 'RecommendationRank']]
)

# 输出为CSV格式(与目标格式一致)
print(final_output.to_csv(index=False))

运行后就能得到你需要的FriendName,Restaurant,RecommendationRank结构的输出。

二、更具扩展性的代码写法

原代码通过多次排序+分组取前N的方式实现,逻辑较为零散,后续修改规则成本较高。下面是拆分逻辑、可读性更强的写法:

核心思路拆分

  1. 过滤菜系数量:先为每个好友的每个菜系标记兴趣排名,过滤掉同一菜系内排名超过2的餐厅
  2. 按规则排序取Top4:对过滤后的结果,按「成本升序→兴趣排名升序」排序,取每个好友的前4家
  3. 生成推荐排名:按兴趣排名最终排序后,为每个好友的推荐列表分配排名

代码实现

import pandas as pd

# 读取原始数据(假设已加载为df)
df = pd.read_csv(pd.io.common.StringIO("""FriendName,Restaurant,InterestRank,Cuisine,Cost,Alcohol
Amy,R2,1,French,1,No
Amy,R6,7,Japanese,0,No
Ben,R5,2,Japanese,1,No
Ben,R2,3,French,1,No
Cathy,R5,1,Japanese,1,No
Cathy,R8,2,Mexican,1,No
Amy,R1,2,French,2,Yes
Amy,R4,3,French,2,Yes
Amy,R3,4,French,1,Yes
Amy,R10,5,Mexican,2,Yes
Ben,R7,1,Japanese,1,Yes
Ben,R4,5,French,2,Yes
Ben,R10,6,Mexican,2,Yes
Ben,R1,9,French,2,Yes
Cathy,R1,5,French,2,Yes
Cathy,R3,6,French,1,Yes
Cathy,R10,7,Mexican,2,Yes
Cathy,R7,9,Japanese,1,Yes
"""))

# 步骤1:过滤每个好友每个菜系的前2个感兴趣餐厅
filtered_df = (
    df
    .assign(
        # 每个好友+菜系内,按InterestRank升序的排名(method='first'处理相同排名的情况)
        cuisine_group_rank=df.groupby(['FriendName', 'Cuisine'])['InterestRank']
                            .rank(method='first', ascending=True)
    )
    .query('cuisine_group_rank <= 2')
    .drop(columns='cuisine_group_rank')
)

# 步骤2:按规则排序,取每个好友的Top4餐厅
top4_df = (
    filtered_df
    .sort_values(
        by=['FriendName', 'Cost', 'InterestRank'],
        ascending=[True, True, True]
    )
    .groupby('FriendName')
    .head(4)
)

# 步骤3:生成最终推荐排名并整理格式
final_output = (
    top4_df
    .sort_values(by=['FriendName', 'InterestRank'], ascending=True)
    .groupby('FriendName', group_keys=False)
    .apply(lambda grp: grp.assign(RecommendationRank=range(1, len(grp)+1)))
    [['FriendName', 'Restaurant', 'RecommendationRank']]
)

# 输出结果
print(final_output.to_csv(index=False))

扩展性说明

  • 若后续修改菜系数量限制(比如改为最多3家),只需修改query('cuisine_group_rank <= 2')中的数字即可
  • 若新增排序规则(比如加入是否提供酒精饮料的优先级),只需修改sort_values的by参数列表
  • 每个步骤只负责单一逻辑,便于调试和维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:22:04