pandas使用lambda按多条件替换DataFrame列值时报ValueError如何解决
错误原因
你写的代码触发报错的核心问题是:apply 遍历column_2的单个值时,if判断语句里的(df.column_2 == 'yes') & (df.column_1 == 'Y')返回的是整个DataFrame所有行对应的布尔值数组,Python的if条件无法直接对一整个数组做真假判断,因此抛出了真值歧义的错误。
解决方案
推荐两种常用的实现方式,优先选择第一种布尔索引赋值,性能远高于apply遍历:
方式1:布尔索引直接赋值(推荐)
直接构造匹配条件的掩码,用loc定位到目标行直接赋值即可,代码简洁性能高:
import numpy as np import pandas as pd # 构造匹配掩码 mask = (df['column_1'] == 'Y') & (df['column_2'] == 'yes') # 定位目标行赋值为NaN df.loc[mask, 'column_2'] = np.nan
方式2:按行apply遍历
如果确实需要用apply实现,要设置axis=1按行遍历,才能同时获取同一行两列的值做判断:
df['column_2'] = df.apply( lambda row: np.nan if row['column_1'] == 'Y' and row['column_2'] == 'yes' else row['column_2'], axis=1 )
运行结果
两种方式处理后最终得到的DataFrame如下:
column_1 column_2 0 X yes 1 X yes 2 Y NaN 3 X yes 4 Y NaN
内容的提问来源于stack exchange,提问作者brunomuller94
相关产品推荐
相关产品推荐

