如何用Pandas实现指定值与非所属行列矩阵最大值的对比判断
解决DataFrame新增列判断当前值是否大于排除所在行和列后矩阵最大值的问题
需求明确
给定一个含数百行、十数列的DataFrame,需新增一列,每行取值为True/False:
- 判断规则:将该行指定列(如示例中的
E列)的值,与排除当前行及该指定列后剩余所有数值数据的最大值对比,若大于则为True,否则为False
解决方案
1. 加载数据
先导入依赖库并加载你提供的实际数据:
import pandas as pd from datetime import datetime # 你的实际数据 data = {'Unnamed: 0': [datetime(2022, 2, 14, 0, 0), datetime(2022, 2, 8, 0, 0), datetime(2022, 2, 16, 0, 0), datetime(2022, 2, 9, 0, 0), datetime(2022, 2, 7, 0, 0)], 'A': [86.3600006103515, 91.1299972534179, 87.9199981689453, 99.4199981689453, 89.8399963378906], 'B': [86.3600006103515, 91.1299972534179, 87.9199981689453, 99.4199981689453, 89.8399963378906], 'C': [93.7399978637695, 92.2099990844726, 93.4599990844726, 99.6900024414062, 90.370002746582], 'D': [85.3799972534179, 89.0100021362304, 86.5299987792968, 91.6999969482421, 85.3199996948242], 'E': [92.870002746582, 89.8499984741211, 87.8399963378906, 98.1800003051757, 85.6600036621093], 'F': [91.8566665649414, 88.8299967447916, 87.6700007120768, 93.4633305867513, 88.3333307902018], 'G': [93.2239990234375, 88.2079986572265, 90.4440002441406, 91.1099975585937, 87.0139999389648], 'H': [90.1189994812011, 88.8899993896484, 90.7769989013672, 89.4299995422363, 89.4699996948242], 'I': [91.8989994049072, 93.9099994659423, 91.107999420166, 93.5399993896484, 94.8799995422363], 'J': [98.1313329060872, 101.261666107177, 95.9039995829264, 100.749666086832, 102.087999471028]} df = pd.DataFrame(data)
2. 核心逻辑实现(Pandas版)
针对你的需求,通过apply遍历每行,排除当前行后计算剩余数据的最大值,再完成对比:
# 指定要对比的目标列(示例为'E'列) target_col = 'E' # 筛选出参与数值计算的列(排除时间列和目标列) calc_cols = df.columns.drop(['Unnamed: 0', target_col]) df_calc = df[calc_cols] def judge_row(row): # 排除当前行,获取剩余数据 rest_data = df_calc.drop(row.name) # 计算剩余数据的全局最大值 max_rest = rest_data.max().max() # 对比目标列值与最大值 return row[target_col] > max_rest # 生成新列 df['is_greater'] = df.apply(judge_row, axis=1)
3. 高效优化版(NumPy版)
如果数据量较大,用NumPy的向量操作替代Pandas的行遍历,效率更高:
import numpy as np # 将计算列转为NumPy数组 calc_arr = df_calc.values # 计算全局最大值 global_max = calc_arr.max() # 计算每行的最大值 row_maxes = calc_arr.max(axis=1) def judge_row_np(row_idx): current_val = df.loc[row_idx, target_col] # 如果当前行包含全局最大值,需重新计算排除该行后的最大值 if row_maxes[row_idx] == global_max: max_rest = calc_arr[np.arange(len(calc_arr)) != row_idx].max() else: max_rest = global_max return current_val > max_rest # 生成新列 df['is_greater'] = [judge_row_np(idx) for idx in df.index]
关键说明
你之前无法正确引用当前行之外的数据,核心问题是没有通过行索引精准排除当前行:
- Pandas中用
df_calc.drop(row.name)即可排除当前行 - NumPy中用
calc_arr[np.arange(len(calc_arr)) != row_idx]实现相同逻辑
内容的提问来源于stack exchange,提问作者kqd
相关产品推荐
相关产品推荐

