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

