You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas根据其他列值替换指定列为NaN的实现及问题排查

问题背景

现有如下测试DataFrame:

contactphone1_xphone2_xphone1_yphone2_yMatch1Match2
11234121234TrueFalse
212345123123FalseTrue
3344442223433213223455FalseFalse
665555533355555333TrueTrue
需求说明

Match1为True时将phone1_y值置空为NaN,Match2为True时将phone2_y值置空,两种期望输出如下:

第一种期望输出

contactphone1_xphone2_xphone1_yphone2_yMatch1Match2
1123412TrueFalse
212345123FalseTrue
3344442223433213223455FalseFalse
6655555333TrueTrue

第二种期望输出

contactphone1_xphone2_xphone1_yphone2_yMatch1Match2
112341212TrueFalse
21234512312345FalseTrue
3344442223433213223455FalseFalse
6655555333TrueTrue
问题排查

使用Python Pandas开发,初始编写代码如下:

df = pd.read_csv('TM.csv', sep=',') #x
df1 = pd.read_csv('TM_verrijk.csv', sep=',') #y 

df['phone1'] = df['phone1'].str.replace('-', '')
df['phone1'] = df['phone1'].str.replace('+', '')
df1['phone1'] = df1['phone1'].str.replace('-', '')
df1['phone1'] = df1['phone1'].str.replace('+', '')

df['phone2'] = df['phone2'].str.replace('-', '')
df['phone2'] = df['phone2'].str.replace('+', '')
df1['phone2'] = df1['phone2'].str.replace('-', '')
df1['phone2'] = df1['phone2'].str.replace('+', '')

dff = df.merge(df1, on='contact')

dff['phone1_x'] = pd.to_numeric(dff['phone1_x'], errors='coerce')
dff['phone1_y'] = pd.to_numeric(dff['phone1_y'], errors='coerce')

dff['phone2_x'] = pd.to_numeric(dff['phone2_x'], errors='coerce')
dff['phone2_y'] = pd.to_numeric(dff['phone2_y'], errors='coerce')

dff['Match?'] = np.where(dff['phone1_x'] == dff['phone1_y'], 'True', 'False')
dff['Match2?'] = np.where(dff['phone2_x'] == dff['phone2_y'], 'True', 'False')

运行后得到的dff和测试DataFrame结构一致,再执行如下代码时出现异常:

dff[['phone1_y','phone2_y']] = np.where(dff[['Match?','Match2?']], 
                                       np.nan, 
                                       dff[['phone1_x','phone2_x']])

运行后所有值都被替换为NaN。

根因与解决方案

最终定位问题为Match?和Match2?是字符串类型,非布尔类型,np.where无法正确识别判断条件,转为布尔类型即可正常运行,修复代码如下:

dff['Match?'] = dff['Match?'].map({'False':False, 'True':True})
dff['Match2?'] = dff['Match2?'].map({'False':False, 'True':True})

内容的提问来源于stack exchange,提问作者hii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:03