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

创建接收DataFrame参数的函数返回最值时遇ValueError问题求助

问题分析与解决

错误原因

  1. 变量名混淆:你定义了temp_dict但后续误用了temp_df,这会直接触发NameError;而你遇到的ValueError核心原因是——
  2. Series的模糊布尔判断:传入函数的df.a、df.b等都是pandas的Series对象,当尝试用sorted对字典排序时,字典的值是Series,排序逻辑会尝试判断Series的布尔值,而pandas无法直接确定整个Series的布尔结果,因此抛出ValueError: The truth value of a Series is ambiguous。
  3. 函数不符合需求:要求函数以DataFrame为参数,但当前函数是接收四个独立的Series参数。

修正方案

直接利用pandas内置方法,简洁高效实现需求:

import pandas as pd

def get_min_max_cols(df):
    # 获取每行最小值对应的列名
    min_col_names = df.idxmin(axis=1)
    # 获取每行最大值对应的列名
    max_col_names = df.idxmax(axis=1)
    return min_col_names, max_col_names

# 示例使用
df = pd.DataFrame({
    'a': [1, 5, 3],
    'b': [2, 1, 4],
    'c': [3, 2, 1],
    'd': [4, 3, 2]
})
df['min'], df['max'] = get_min_max_cols(df)
print(df)

手动实现版本(不用内置方法)

如果想手动处理每行数据,可逐行迭代:

def get_min_max_cols(df):
    min_cols = []
    max_cols = []
    for _, row in df.iterrows():
        # 将行数据转为键值对并按值排序
        sorted_row = sorted(row.items(), key=lambda x: x[1])
        min_cols.append(sorted_row[0][0])
        max_cols.append(sorted_row[-1][0])
    return pd.Series(min_cols), pd.Series(max_cols)

原代码适配版本(保留参数形式)

如果一定要保留原函数的参数形式,需对每行数据应用函数:

def sort_value(a, b, c, d):
    temp_dict = {'a':a, 'b':b, 'c':c, 'd':d}
    # 按值排序键值对
    sorted_items = sorted(temp_dict.items(), key=lambda item: item[1])
    return sorted_items[0][0], sorted_items[-1][0]

# 对每行应用函数
df[['min', 'max']] = df.apply(lambda row: sort_value(row['a'], row['b'], row['c'], row['d']), axis=1, result_type='expand')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:25:23