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

Pandas如何不新增列基于两列计算值筛选最大值对应行

Pandas 不新增列筛选储蓄额最高行的实现方法

测试数据

本次用到的示例DataFrame构造代码如下:

import pandas as pd

data = {'Name': ["Babu", "Shyam", "Raju", "Anuradha", "Kabira"],
       'Age': [60, 35, 32, 31, 37],
       'Income': [20000, 10000, 8000, 12000, 5000],
       'Stupidity Level': [80, 40, 60, 20, 70],
       'Expenses': [15000,8000,7000,9000,4000]
       }

index = ["Paresh Rawal", "Suniel Shetty", "Akshay Kumar","Tabu", "Gulshan Grover"]

df = pd.DataFrame(data, index)

需求是不新增永久存储的储蓄额列,直接筛选出Income(收入)减Expenses(支出)得到的储蓄额最高的对应行。

原有写法问题

之前两种写法无法运行的核心原因:

  • 直接给df[]传入标量值时,Pandas默认按列名做匹配,传入储蓄额最大值5000时,原表不存在名为5000的列,会直接触发KeyError。
  • 逻辑上缺少逐行布尔判断、最大值行定位的步骤,无法匹配到目标行。

正确实现方案

以下写法的储蓄额计算均为临时运算,不会在原DataFrame中新增实体列:

方案1:取第一个最高储蓄额对应行(返回Series格式)

用idxmax()获取逐行计算储蓄额后,最大值对应的行索引,再通过loc定位目标行:

df.loc[(df["Income"] - df["Expenses"]).idxmax()]

运行返回结果:

Name               Babu
Age                  60
Income            20000
Stupidity Level      80
Expenses          15000
Name: Paresh Rawal, dtype: object

方案2:返回所有最高储蓄额行(返回DataFrame格式,兼容并列场景)

通过布尔索引筛选所有储蓄额等于最大值的行,如果存在多人储蓄额并列第一,会一次性返回全部符合条件的记录:

df[df["Income"] - df["Expenses"] == (df["Income"] - df["Expenses"]).max()]

补充说明

如果后续需要多次基于储蓄额做计算,再考虑给DataFrame新增savings列即可,单次筛选场景下临时计算不会额外占用存储,效率也没有差异。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:04:24