创建接收DataFrame参数的函数返回最值时遇ValueError问题求助
问题分析与解决
错误原因
- 变量名混淆:你定义了
temp_dict但后续误用了temp_df,这会直接触发NameError;而你遇到的ValueError核心原因是—— - Series的模糊布尔判断:传入函数的
df.a、df.b等都是pandas的Series对象,当尝试用sorted对字典排序时,字典的值是Series,排序逻辑会尝试判断Series的布尔值,而pandas无法直接确定整个Series的布尔结果,因此抛出ValueError: The truth value of a Series is ambiguous。 - 函数不符合需求:要求函数以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
相关产品推荐
相关产品推荐

