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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:35:04