python - 将 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)'''
我错过了什么?提前致谢。
解决方案
您想要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"]]
推荐阅读
- android - 如何在 android 中记录查询 SQLite 查询?
- php - 在laravel中发送电子邮件时调用客户端电子邮件地址
- java - 如何使用此公式计算 SIN 号码是否有效?
- python - 如何将 conda 包导入谷歌 colab?
- swift - 为什么我的 .delaysTouchesBegan 无法始终如一地工作?
- sql - 如何在 Sybase ASE 15.7 中比较两个表
- python - 循环生成器
- javascript - 总和的Javascript。未捕获的类型错误:无法读取 null 的属性“行”
- sql-server - 使用 pentaho 数据集成器从 SQL Server 表中的 varchar(max) 列加载 Oracle 表中的 clob 列时提高性能
- matlab - 如何将数据采集 Matlab 脚本转换为 Simulink?