使用pandas assign方法生成新列遇ValueError,求正确实现方案
解决pandas assign中条件赋值的歧义错误
你的错误出在lambda里的条件判断:x['Address'].isna()返回的是一个布尔类型的Series,直接用if-else判断整个Series会触发"真值歧义"错误——pandas无法确定你要判断整个Series的全部为真、任意为真还是其他逻辑,因此必须使用矢量化的条件处理方法来逐行判断。
以下是几种用assign链式调用实现需求的正确方案:
方案1:使用numpy.where(最直观)
利用np.where实现矢量化的条件分支,逐行判断Address是否为NaN:
import pandas as pd import numpy as np df = pd.DataFrame({'Address': ['234 JALAN ST KULAR LUMPUR MALAYSIA', '123 BUILDING STREET SINGAPORE', '67 CANNING VALE, HONG KONG', np.nan]}) df_mod = ( df .assign( Verify = lambda x: np.where(x['Address'].isna(), '--', 'Yes') ) )
方案2:使用pandas.Series.where
pandas的Series自带where方法,默认保留满足条件的值,否则替换为指定值(这里需要取反判断):
df_mod = ( df .assign( Verify = lambda x: 'Yes'.where(~x['Address'].isna(), '--') ) )
方案3:使用map映射布尔值
先通过notna()得到布尔Series,再用map将True/False映射为对应的字符串:
df_mod = ( df .assign( Verify = lambda x: x['Address'].notna().map({True: 'Yes', False: '--'}) ) )
以上三种方案都能得到你期望的结果:
Address Verify 0 234 JALAN ST KULAR LUMPUR MALAYSIA Yes 1 123 BUILDING STREET SINGAPORE Yes 2 67 CANNING VALE, HONG KONG Yes 3 NaN --
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

