首页 > 解决方案 > 将 if/else 逻辑应用于函数中的数据框:ValueError:系列的真值不明确

问题描述

我想根据 if/then 逻辑在数据框中创建一个新列。实际问题的规则是相当复杂的 CART 树的输出。我遇到的问题是,当我尝试将该函数应用于我的数据框时,我收到错误消息:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我很确定这是因为“if”逻辑试图将输入评估为一个系列,而不是逐行评估。我只是想不出解决办法。

要复制:

import pandas as pd
import numpy as np
np.random.seed(1)

#create sample dataframe
df_test = pd.DataFrame({"llflag": np.random.normal(0,1,100)})

#sample if/else logic
def tree1(df):
  if df['llflag'] <= 0.5:
      return 4
  else:  
      return 3
  return 

#attempt to apply function to df
df_test['testRR'] = df_test.apply(tree1(df_test ), axis = 1)

我得到了相同的结果。

df_test['testRR'] = df_test.apply(lambda  x: tree1( df_test), axis = 1)'''

我错过了什么?提前致谢。

标签: pythonfunctiondataframeif-statement

解决方案


您想要apply每一行的函数,而不是apply评估的函数df_test(失败),所以删除括号:

df_test['testRR'] = df_test.apply(tree1, axis = 1)

也试图阻止使用apply,所以这里有一个不同的更快的版本:

df_test['testRR'] = np.where(df_test['llflag'] <= 0.5, 4, 3)

或列表组合版本(也更快):

def tree2(row):
    return 4 if row <=0.5 else 3

df_test['testRR'] = [tree2(row) for row in df_test["llflag"]]

推荐阅读