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

如何在Pandas DataFrame中定位最小值行并获取对应disp列值

解决DataFrame中查找最小值对应行并提取列值的问题

问题原因

你遇到的两个核心问题:

  1. 方法误用:index.get_indexer([min_diff])是用来查找DataFrame索引值的位置,而非某一列中的值,完全不适用当前场景。
  2. 浮点数精度误差:即使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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:35:19