如何在Pandas DataFrame中按多值匹配分配优先级分数?
解决方案
要解决这个按位置优先级打分的问题,核心是按优先级从高到低判断(1类地点优先级最高,只要包含就打1;再判断2类地点;最后默认3分),以下是两种可行的实现方式:
方法1:用np.select(推荐,矢量化高效)
这种方式适合大数据量,利用矢量化操作提升运行效率:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'Business': ['X.', 'Y.', 'Z.', 'D.'], 'Location': ['Beirut,Aley', 'Saida,Sour', 'Baalbeck,Tripoli', 'Tripoli'] }) # 定义条件列表(按优先级从高到低排序) conditions = [ # 优先判断是否包含1类地点 df['Location'].str.contains('Beirut|Saida', case=False), # 再判断是否包含2类地点 df['Location'].str.contains('Baalbeck|Sour', case=False) ] # 对应条件的分数 scores = [1, 2] # 应用规则,未匹配任何条件时默认分数为3 df['Score'] = np.select(conditions, scores, default=3)
运行后得到的结果与你期望的一致:
Business Location Score 0 X. Beirut,Aley 1 1 Y. Saida,Sour 1 2 Z. Baalbeck,Tripoli 2 3 D. Tripoli 3
方法2:用apply(直观易读,适合小数据量)
如果数据量不大,用apply编写自定义函数会更直观易懂:
import pandas as pd df = pd.DataFrame({ 'Business': ['X.', 'Y.', 'Z.', 'D.'], 'Location': ['Beirut,Aley', 'Saida,Sour', 'Baalbeck,Tripoli', 'Tripoli'] }) def get_score(location): if 'Beirut' in location or 'Saida' in location: return 1 elif 'Baalbeck' in location or 'Sour' in location: return 2 else: return 3 df['Score'] = df['Location'].apply(get_score)
你之前用str.contains失败的原因
大概率是判断顺序错误:如果先检查2类地点(Baalbeck/Sour),那同时包含Saida和Sour的行(比如Y.)会被错误标记为2分,而不是正确的1分。必须先处理优先级最高的1类地点,再依次判断低优先级的规则。
内容的提问来源于stack exchange,提问作者Salem Shehabeddin
相关产品推荐
相关产品推荐

