如何基于Pandas多值Location列与业务规则计算Priority字段?
Pandas处理多值Location列计算Priority字段
需求说明
现有高级地点集合:贝鲁特(Beirut)、赛达(Saida),需基于以下规则为Pandas数据框计算Priority字段:
- 若
Location包含完全匹配的高级地点,且BusScore为0.75 →Priority = 1 - 若
Location包含完全匹配的高级地点,且BusScore为0.5 →Priority = 2 - 若
Location无任何完全匹配的高级地点 →Priority = 3
注:地点名称需完全匹配,例如BeirutX不视为匹配;需处理Location中带标点、空白的情况(如示例中的Tripoli.)。
输入示例
Business Location BusScore X. Beirut, Aley 0.75 Y. Saida, Sour 0.5 Z. Baalbeck,Tripoli 0.75 D. Tripoli. 0.75
期望输出
Business Location BusScore Priority X. Beirut, Aley 0.75 1 Y. Saida, Sour 0.50 2 Z. Baalbeck,Tripoli 0.75 3 D. Tripoli. 0.75 3
代码实现
import pandas as pd # 定义高级地点集合(集合查询效率优于列表) premium_locations = {'Beirut', 'Saida'} # 构造示例数据 data = { 'Business': ['X.', 'Y.', 'Z.', 'D.'], 'Location': ['Beirut, Aley', 'Saida, Sour', 'Baalbeck,Tripoli', 'Tripoli.'], 'BusScore': [0.75, 0.5, 0.75, 0.75] } df = pd.DataFrame(data) # 编写优先级计算逻辑 def calculate_priority(row): # 拆分地点并清理格式:去空白、去末尾句号 cleaned_locations = [loc.strip().rstrip('.') for loc in row['Location'].split(',')] # 检查是否存在匹配的高级地点 has_match = any(loc in premium_locations for loc in cleaned_locations) if has_match: if row['BusScore'] == 0.75: return 1 elif row['BusScore'] == 0.5: return 2 return 3 # 生成Priority列 df['Priority'] = df.apply(calculate_priority, axis=1) # 打印结果 print(df.to_string(index=False))
关键逻辑说明
- 高级地点用集合存储:集合的
in操作时间复杂度为O(1),比列表的O(n)更高效,适合批量查询; - 地点格式清理:拆分
Location后,去除每个地点的前后空白和末尾的标点(如示例中的.),避免因格式问题导致匹配失败; - 逐行应用逻辑:通过
apply(axis=1)逐行处理数据,按规则判断并返回对应的优先级值; - 规则优先级:先判断是否匹配高级地点,再根据
BusScore值返回对应优先级,最后默认返回3。
内容的提问来源于stack exchange,提问作者Salem Shehabeddin
相关产品推荐
相关产品推荐

