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

