使用自定义函数为pandas DataFrame新增字段触发ValueError如何解决
错误原因
你代码中df['calories'] > 200返回的是由True/False组成的Series结构(对应每一行calories列的判断结果),而Python原生的if条件判断只能接收单个布尔值,无法直接判定整个Series的真值,因此触发该报错。
解决方法
下面给出3种常用的实现方案:
方案1:使用numpy.where(最简洁,性能最优)
直接向量化运算,不需要自定义函数,一行完成赋值:
import pandas as pd import numpy as np data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } df = pd.DataFrame(data) df["new_field"] = np.where(df['calories'] > 200, "OutputA", "OutputB") print(df)
方案2:使用DataFrame.apply按行判断
如果逻辑比较复杂必须用自定义函数,可以用apply对每行进行遍历判断,需要修改自定义函数的入参为单行数据:
import pandas as pd data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } df = pd.DataFrame(data) # 入参改为行对象 def test_function(row): if row['calories'] > 200: return "OutputA" else: return "OutputB" # axis=1表示按行遍历 df["new_field"] = df.apply(test_function, axis=1) print(df)
方案3:布尔索引直接赋值
通过条件筛选分别给对应行赋值:
import pandas as pd data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } df = pd.DataFrame(data) # 先给所有行赋默认值 df["new_field"] = "OutputB" # 筛选符合条件的行替换为OutputA df.loc[df['calories'] > 200, "new_field"] = "OutputA" print(df)
内容的提问来源于stack exchange,提问作者Rutnet
相关产品推荐
相关产品推荐

