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
相关产品推荐
相关产品推荐

