如何在Pandas DataFrame中定位最小值行并获取对应disp列值
解决DataFrame中查找最小值对应行并提取列值的问题
问题原因
你遇到的两个核心问题:
- 方法误用:
index.get_indexer([min_diff])是用来查找DataFrame索引值的位置,而非某一列中的值,完全不适用当前场景。 - 浮点数精度误差:即使
min_diff是abs_loaddiff列的最小值,由于浮点数的二进制存储特性,直接用精确值匹配可能失败,导致找不到对应行。
正确解决方案
方法1:直接用idxmin()(最简便)
idxmin()会直接返回指定列最小值所在的行索引,无需处理精度问题:
# 获取abs_loaddiff最小值对应的行索引 min_row_index = df['abs_loaddiff'].idxmin() # 提取该行的disp列值 target_disp_value = df.loc[min_row_index, 'disp'] print(target_disp_value)
方法2:带精度阈值的布尔匹配(应对极端精度场景)
如果担心浮点数精度导致idxmin()出现异常,可以设置一个极小的阈值,匹配与min_diff接近的行:
# 设置精度阈值(可根据需求调整) precision_threshold = 1e-9 # 筛选出abs_loaddiff与min_diff差值小于阈值的行 matching_rows = df[df['abs_loaddiff'].sub(min_diff).abs() < precision_threshold] # 提取disp值(若有多个匹配行,取第一个) target_disp_value = matching_rows['disp'].iloc[0] print(target_disp_value)
修正后的完整代码
注意原代码中laoddevelopment-lastline_reduced会报错(列表无法直接与标量做减法),已一并修正:
import numpy as np import pandas as pd specificload_reading = np.loadtxt('pannelloBschema1_0.t19.glo', skiprows = 2) lastline = (specificload_reading[-1][1] + specificload_reading[-1][2])/1000 lastline_reduced = 0.7 * lastline laoddevelopment = [(el[2]+el[1])/1000 for el in specificload_reading] dispdevelopment = [-el*1000 for el in specificload_reading[:,0]] data = { "disp": dispdevelopment, "load": laoddevelopment, "70%load": lastline_reduced, "load_diff": np.array(laoddevelopment) - lastline_reduced # 转numpy数组支持标量减法 } df = pd.DataFrame(data) df['abs_loaddiff']= (df['load'] - df['70%load']).abs() somerows = df.iloc[0:3] print(somerows) min_diff = df['abs_loaddiff'].min() print(min_diff) #>>> 0.7222780000000029 # 方案1:用idxmin获取对应disp值 min_row_index = df['abs_loaddiff'].idxmin() target_disp = df.loc[min_row_index, 'disp'] print(f"对应disp值:{target_disp}")
内容的提问来源于stack exchange,提问作者Giada Bartolini
相关产品推荐
相关产品推荐

