Pandas DataFrame 按行查找满足1-5条件的对应列最大值
实现代码
可读性优先方案(小数据量适用)
逻辑清晰易调整,适合万行以内的数据集:
import pandas as pd # 测试用DataFrame df = pd.DataFrame({'Type': ['X', 'Y', 'Z'], 'ID': [1212, 2342, 2421], 'A1': [1, 1, 1], 'A2': [0.3, 0.004, 0.86], 'B1': [2, 1.5, 3], 'B2': [0.1, 0.8, 0.005], 'C1': [3, 2, 5], 'C2': [0.8, 0.2, 0.3], 'D1': [4, 2.5, 7], 'D2': [0.2, 0.4, 0.004], 'E1': [5, 3, 9], 'E2': [0.9, 0.005, 0.99], 'F1': [6, 3.5, 11], 'F2': [0.4, 0.3, 0.4], 'G1': [7, 5, 13], 'G2': [0.6, 0.85, 0.003], 'H1': [8, 4.5, 15], 'H2': [0.94, 0.088, 0.85], 'J1': [9, 5, 17], 'J2': [0.003, 0.0001,0.3]}) # 列名公共前缀配置 prefix_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J'] def calc_row_max(row): valid_values = [] for p in prefix_list: # 校验对应后缀为1的列数值是否在1-5闭区间内 if 1 <= row[f"{p}1"] <=5: valid_values.append(row[f"{p}2"]) # 无符合条件值时返回空值,可按需修改默认返回值 return max(valid_values) if valid_values else pd.NA df['Max_Value'] = df.apply(calc_row_max, axis=1) # 打印完整结果验证 print(df)
性能优先方案(大数据量适用)
采用向量化操作替代行遍历,处理十万行以上数据时效率提升显著:
prefix_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J'] # 生成符合区间条件的掩码矩阵 condition_mask = df[[f"{p}1" for p in prefix_list]].apply(lambda x: (x>=1)&(x<=5)).values # 提取所有后缀为2的列数值矩阵 value_matrix = df[[f"{p}2" for p in prefix_list]].values # 不符合条件的位置替换为空值后计算每行最大值 df['Max_Value'] = pd.DataFrame(value_matrix).where(condition_mask).max(axis=1).values
结果验证
最终新增的Max_Value列计算结果如下:
| Type | ID | Max_Value |
|---|---|---|
| X | 1212 | 0.90 |
| Y | 2342 | 0.85 |
| Z | 2421 | 0.86 |
内容的提问来源于stack exchange,提问作者Kahraman
相关产品推荐
相关产品推荐

