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

如何在Pandas DataFrame中无需新建DataFrame获取周一最高OverallGrade及StudentID?

需求说明

需要过滤Pandas DataFrame中Days为Monday的数据,从中找到最高的OverallGrade并显示对应的StudentID。目前已通过新建仅包含周一数据的DataFrame实现需求,但希望不创建新DataFrame完成操作,且不将Days设为索引(实际数据中Days为日期,此处简化为星期名称)。

原始实现代码

import pandas as pd

ClassData = {
  "Days":         ["Monday","Wednesday","Monday","Friday","Tuesday","Monday","Friday"],
  "OverallMarks": [   150,     140,       180,      250,      200 ,    240,     170  ],
  "OverallGrade": [    70,      60,        90,      110,       85 ,     80,      71  ],
  "StudentID" :   ['a','b', 'c', 'd', 'e', 'f', 'g']
}

MyDataFrame1 = pd.DataFrame(ClassData)

# 我使用的替代方案 - 创建仅包含周一数据的新DataFrame
NewDataFrame = MyDataFrame1[ MyDataFrame1['Days'] == "Monday" ] # 获取所有周一数据
print( NewDataFrame[ NewDataFrame['OverallGrade'] == int(NewDataFrame['OverallGrade'].max()) ][['StudentID','OverallGrade']] ) 
# 获取最高分数90并显示学生ID和分数

不创建新DataFrame的解决方案

以下几种方法均无需新建DataFrame,直接在原数据上完成筛选提取:

方法1:链式条件过滤

直接叠加筛选条件,一次性定位目标行并提取指定列:

import pandas as pd

ClassData = {
  "Days":         ["Monday","Wednesday","Monday","Friday","Tuesday","Monday","Friday"],
  "OverallMarks": [   150,     140,       180,      250,      200 ,    240,     170  ],
  "OverallGrade": [    70,      60,        90,      110,       85 ,     80,      71  ],
  "StudentID" :   ['a','b', 'c', 'd', 'e', 'f', 'g']
}

MyDataFrame1 = pd.DataFrame(ClassData)

# 链式过滤,无需新建DataFrame
result = MyDataFrame1[
    (MyDataFrame1['Days'] == "Monday") & 
    (MyDataFrame1['OverallGrade'] == MyDataFrame1[MyDataFrame1['Days'] == "Monday"]['OverallGrade'].max())
][['StudentID', 'OverallGrade']]

print(result)

方法2:利用idxmax()定位行索引

先找到周一数据中OverallGrade最大值对应的行索引,再直接提取该行数据,效率更高:

import pandas as pd

ClassData = {
  "Days":         ["Monday","Wednesday","Monday","Friday","Tuesday","Monday","Friday"],
  "OverallMarks": [   150,     140,       180,      250,      200 ,    240,     170  ],
  "OverallGrade": [    70,      60,        90,      110,       85 ,     80,      71  ],
  "StudentID" :   ['a','b', 'c', 'd', 'e', 'f', 'g']
}

MyDataFrame1 = pd.DataFrame(ClassData)

# 获取周一数据中OverallGrade最大值的行索引
max_idx = MyDataFrame1[MyDataFrame1['Days'] == "Monday"]['OverallGrade'].idxmax()

# 提取对应行的指定列
result = MyDataFrame1.loc[max_idx, ['StudentID', 'OverallGrade']]

print(result)

方法3:使用query()方法(代码更简洁)

通过query()编写自然的条件语句,可读性更强:

import pandas as pd

ClassData = {
  "Days":         ["Monday","Wednesday","Monday","Friday","Tuesday","Monday","Friday"],
  "OverallMarks": [   150,     140,       180,      250,      200 ,    240,     170  ],
  "OverallGrade": [    70,      60,        90,      110,       85 ,     80,      71  ],
  "StudentID" :   ['a','b', 'c', 'd', 'e', 'f', 'g']
}

MyDataFrame1 = pd.DataFrame(ClassData)

# 计算周一数据的OverallGrade最大值
max_grade = MyDataFrame1[MyDataFrame1['Days'] == "Monday"]['OverallGrade'].max()

# 使用query筛选目标行
result = MyDataFrame1.query('Days == "Monday" and OverallGrade == @max_grade')[['StudentID', 'OverallGrade']]

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:10:20