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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:00:57