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

Pandas DataFrame按优先级从指定列筛选符合列表值的实现

没问题,我来帮你搞定这个需求!咱们先把逻辑捋清楚:对于每行的指定列,先从L1里挑所有存在的值取最大;如果L1里一个都没有,就从L2里挑值取最大;最后再用L3里的最大值,而且题目说三个列表覆盖了所有可能值,所以不用担心最后没值的情况。

下面直接上代码,我会用示例数据演示,你可以直接套用到自己的数据集上。

1. 先准备示例数据和定义优先级列表

首先咱们创建一个带无关列的DataFrame,模拟你的真实数据:

import pandas as pd
import numpy as np

# 模拟真实数据,包含目标列和无关列
df = pd.DataFrame({
    'col_a': [5, 20, 3, 15, 1],
    'col_b': [10, 5, 1, 20, 3],
    'col_c': [1, 15, 10, 3, 1],
    '无关列_1': ['x', 'y', 'z', 'w', 'v'],
    '无关列_2': [True, False, True, False, True]
})

# 定义你的三个优先级列表(示例值,替换成你实际的列表即可)
L1 = [10, 20]  # 最高优先级
L2 = [5, 15]   # 次优先级
L3 = [1, 3]    # 最低优先级

# 指定需要考虑的目标列(替换成你实际的列名)
target_cols = ['col_a', 'col_b', 'col_c']

2. 方案一:简单直观的apply方法(适合小数据集)

这种方法代码逻辑清晰,容易理解,适合数据量不大的情况:

def get_priority_max(row, target_cols, L1, L2, L3):
    # 提取当前行的目标列值
    row_values = row[target_cols].values
    # 先筛选L1中的值,有就取最大
    l1_candidates = row_values[np.isin(row_values, L1)]
    if len(l1_candidates) > 0:
        return max(l1_candidates)
    # 没有L1的值就找L2的最大值
    l2_candidates = row_values[np.isin(row_values, L2)]
    if len(l2_candidates) > 0:
        return max(l2_candidates)
    # 最后取L3的最大值(题目说所有值都在三个列表里,所以肯定有值)
    l3_candidates = row_values[np.isin(row_values, L3)]
    return max(l3_candidates)

# 新增列,应用自定义函数
df['优先级最大值'] = df.apply(lambda r: get_priority_max(r, target_cols, L1, L2, L3), axis=1)

3. 方案二:矢量化实现(适合大数据集,性能更优)

如果你的数据量很大,apply逐行处理会比较慢,推荐用矢量化方法,利用Pandas的内置函数提升效率:

# 先提取目标列的子集
target_subset = df[target_cols]

# 标记每个值是否属于对应列表,并用where保留对应值,其余设为NaN
l1_masked = target_subset.where(target_subset.isin(L1))
l2_masked = target_subset.where(target_subset.isin(L2))
l3_masked = target_subset.where(target_subset.isin(L3))

# 计算每行的最大值(NaN会被忽略)
l1_row_max = l1_masked.max(axis=1)
l2_row_max = l2_masked.max(axis=1)
l3_row_max = l3_masked.max(axis=1)

# 按优先级合并:优先取L1的最大值,没有就用L2,最后用L3
df['优先级最大值'] = l1_row_max.combine_first(l2_row_max).combine_first(l3_row_max)

验证结果

运行完上面的代码后,你会得到新增的优先级最大值列,对应每行的结果:

  • 第1行:L1里有10,所以值为10
  • 第2行:L1里有20,所以值为20
  • 第3行:L1里有10,所以值为10
  • 第4行:L1里有20,所以值为20
  • 第5行:L1和L2都没有值,取L3的最大值3

你只需要把示例中的L1/L2/L3和target_cols替换成你实际的列表和列名就可以直接用啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:00