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

