如何生成指定格式的餐厅推荐结果?优化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的方式实现,逻辑较为零散,后续修改规则成本较高。下面是拆分逻辑、可读性更强的写法:
核心思路拆分
- 过滤菜系数量:先为每个好友的每个菜系标记兴趣排名,过滤掉同一菜系内排名超过2的餐厅
- 按规则排序取Top4:对过滤后的结果,按「成本升序→兴趣排名升序」排序,取每个好友的前4家
- 生成推荐排名:按兴趣排名最终排序后,为每个好友的推荐列表分配排名
代码实现
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
相关产品推荐
相关产品推荐

