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

如何利用Pandas和Matplotlib根据y=0.5获取多列数据对应x值?

解决方法:从归一化数据中获取y=0.5对应的温度值

我来帮你搞定这个需求——因为原始数据里没有刚好y=0.5的点,线性插值是最直接的解决方案,同时我们可以结合Matplotlib可视化交点来验证结果。先给你修正并完善代码,再拆解关键步骤:

核心思路

  1. 先筛选出用户指定温度范围的数据,确保数据按温度排序(插值必须基于有序的x轴数据)
  2. 对筛选后的列做归一化(注意要基于筛选后的数据,而不是全局数据,避免之前代码里的重复归一化问题)
  3. 用插值函数反向计算:输入y=0.5,得到对应的温度值
  4. 可视化标记交点,直观确认结果

完整实现代码

import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

# 读取原始数据
df = pd.read_csv('test.csv', header=0, sep=',')
x_column = 'Temperature'
# 提取除温度外的所有数值列
value_columns = [col for col in df.columns if col != x_column]
print(f"待处理的数值列:{value_columns}")

# 用户输入温度范围并筛选数据
min_temp = int(input("输入最低温度:"))
max_temp = int(input("输入最高温度:"))
filtered_df = df[(df[x_column] >= min_temp) & (df[x_column] <= max_temp)]

# 关键:确保数据按温度升序排列(插值依赖有序x)
filtered_df = filtered_df.sort_values(by=x_column)

# 对筛选后的数值列做归一化处理
for col in value_columns:
    col_min = filtered_df[col].min()
    col_max = filtered_df[col].max()
    # 避免除以0的情况(如果列内所有值相同)
    if col_max != col_min:
        filtered_df[col] = (filtered_df[col] - col_min) / (col_max - col_min)
    else:
        filtered_df[col] = 0.0  # 可根据需求调整这个默认值

# 绘制归一化后的曲线和y=0.5水平线
plt.figure(figsize=(10, 6))
ax = filtered_df.plot(x=x_column, ax=plt.gca())
plt.axhline(y=0.5, color='black', linestyle='--', label='y=0.5')
plt.legend()
plt.title("归一化数据与y=0.5交点")

# 计算每一列y=0.5对应的温度,并标记到图上
result_dict = {}
for col in value_columns:
    # 获取当前列的x(温度)和y(归一化值)数组
    x_vals = filtered_df[x_column].values
    y_vals = filtered_df[col].values
    
    # 创建线性插值函数:输入y值,输出对应的x值
    # kind参数可选'linear'(线性)或'cubic'(三次样条,更平滑)
    interpolator = interp1d(y_vals, x_vals, kind='linear', fill_value='extrapolate')
    
    # 计算y=0.5对应的温度
    temp_at_05 = interpolator(0.5)
    result_dict[col] = temp_at_05
    
    # 在图上标记交点并添加文本标注
    plt.scatter(temp_at_05, 0.5, color='darkred', s=50, zorder=10)
    plt.text(temp_at_05, 0.52, f"{col}\n{temp_at_05:.2f}°C", fontsize=9, ha='center')

plt.tight_layout()
plt.show()

# 打印最终结果
print("\n各列y=0.5对应的温度值:")
for col, temp in result_dict.items():
    print(f"{col}: {temp:.2f} °C")

关键细节说明

  • 插值函数的使用:这里用scipy.interpolate.interp1d,我们把y作为输入、x作为输出,这样直接传入0.5就能得到对应的温度。如果需要更平滑的插值结果,可以把kind参数改成'cubic'。
  • 数据排序:必须保证温度列是有序的,否则插值结果会出错,所以代码里加了sort_values(by=x_column)。
  • 异常处理:如果某列所有值都相同,归一化后会全为0,这时候我们设置默认值为0.0,避免除以0的报错。
  • 可视化验证:用红色散点标记交点,配合文本标注,能直观看到每个列对应的温度值是否合理。

替代方案(无需Scipy)

如果你不想额外安装Scipy,也可以用Pandas自带的插值功能实现:

# Pandas插值实现方式
result_dict = {}
for col in value_columns:
    # 创建临时DataFrame,添加一行y=0.5的记录
    temp_df = filtered_df[[x_column, col]].copy()
    temp_df.loc[len(temp_df)] = [None, 0.5]
    # 按y值排序后插值x值
    temp_df = temp_df.sort_values(by=col)
    temp_df = temp_df.interpolate(method='linear')
    # 提取y=0.5对应的温度
    temp_at_05 = temp_df[temp_df[col] == 0.5][x_column].values[0]
    result_dict[col] = temp_at_05

print("\n各列y=0.5对应的温度值:")
for col, temp in result_dict.items():
    print(f"{col}: {temp:.2f} °C")

这种方法通过构造包含y=0.5的行,再排序插值得到对应的x值,效果和Scipy方法一致,适合不想额外依赖库的场景。

内容的提问来源于stack exchange,提问作者Darius Šulskis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:48