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

Pandas如何从两个DataFrame中自动获取最值对应的索引与数值

双同索引单值列DataFrame全局最值自动提取方案

你当前写法的核心问题是合并两个序列时保留了重复列名,idxmin() 仅会逐列返回各自的最值位置,不会做跨DataFrame的全局值比较,因此必须手动判断最值归属。
可复用的无手动介入实现逻辑如下:

  • 合并序列时提前标记来源,避免列名冲突
  • 将合并后的宽表转为长表,统一存储所有值对应的时间索引、来源DataFrame、具体数值
  • 直接对数值列做最值筛选,自动拿到归属信息,无需手动校验

基础实现(以全局最小值为例)

import pandas as pd

# 合并时给两个序列加来源标识,解决列名重复问题
combined = pd.concat(
    [df1.col1.rename("df1"), df2.col1.rename("df2")],
    axis=1
)
# 转换为长表,每行对应一条「时间-来源-数值」记录
long_df = combined.stack().reset_index(name="value")
long_df.columns = ["timestamp", "source_df", "value"]

# 提取全局最小值行,求最大值把idxmin替换为idxmax即可
global_extreme_row = long_df.loc[long_df["value"].idxmin()]

返回的结果行直接包含全部需要的信息:

  • timestamp:最值对应的时间索引
  • source_df:最值所属的DataFrame标识(df1/df2)
  • value:最值的具体数值

取值时不需要手动判断来源,通过映射直接定位即可:

用字典做来源映射比调用全局变量更稳妥,适合函数封装场景

# 建立来源和DataFrame的映射
df_mapping = {"df1": df1, "df2": df2}
# 自动定位到对应DataFrame的目标值
target_value = df_mapping[global_extreme_row["source_df"]].col1.loc[global_extreme_row["timestamp"]]

可复用封装函数

支持一键切换最小值/最大值计算,适配两个同索引、同名单值列的DataFrame场景:

def get_global_extreme(df1, df2, val_col, mode="min"):
    """
    自动提取两个同时间索引单值列DataFrame的全局最值
    :param df1: 第一个输入DataFrame
    :param df2: 第二个输入DataFrame
    :param val_col: 两个DataFrame中存储目标数值的列名
    :param mode: 计算模式,"min"为最小值,"max"为最大值
    :return: 包含时间索引、来源、最值的结果对象
    """
    df_mapping = {"df1": df1, "df2": df2}
    # 合并并标记来源
    combined = pd.concat(
        [df1[val_col].rename("df1"), df2[val_col].rename("df2")],
        axis=1
    )
    # 转长表
    long_df = combined.stack().reset_index(name="value")
    long_df.columns = ["timestamp", "source", "value"]
    # 按模式取最值
    if mode == "min":
        res = long_df.loc[long_df["value"].idxmin()]
    elif mode == "max":
        res = long_df.loc[long_df["value"].idxmax()]
    else:
        raise ValueError("mode参数仅支持传入'min'或'max'")
    # 附加直接提取好的目标值
    res["target_val"] = df_mapping[res["source"]][val_col].loc[res["timestamp"]]
    return res

调用示例

# 计算全局最小值
min_result = get_global_extreme(df1, df2, val_col="col1", mode="min")
# 计算全局最大值
max_result = get_global_extreme(df1, df2, val_col="col1", mode="max")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:01:02