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

使用过滤后的DataFrame更新原DataFrame后旧值重现的问题排查

问题分析:Pandas DataFrame.update() 未正确覆盖空值列

初始DataFrame数据

StreetCityStateZip
4210 Nw Lake DrLees SummitMo64064
9810 Scripps Lake Dr. Suite A San DiegoCa - 92131
1124 Ethel StGlendaleCa91207
4000 E Bristol St Ste 3 ElkhartIn-46514

预期输出

StreetCityStateZip
4210 Nw Lake DrLees SummitMo64064
9810 Scripps Lake Dr. Suite A San DiegoCa92131
1124 Ethel StGlendaleCa91207
4000 E Bristol St Ste 3 ElkhartIn46514

执行代码

Filter3_df= Final[Final['State'].isnull()]
Filter3_df['temp'] = Filter3_df['City'].str.extract('([A-Za-z]+)')
mask2= Filter3_df['temp'].notnull()
Filter3_df.loc[mask2, 'Zip']    = Filter3_df.loc[mask2, 'City'].str[-5:]
Filter3_df.loc[mask2, 'State']  = Filter3_df.loc[mask2, 'temp']
del Filter3_df['temp']
Filter3_df['City']= float('NaN')

处理后的Filter3_df数据

StreetCityStateZip
9810 Scripps Lake Dr. Suite A San DiegoCa92131
4000 E Bristol St Ste 3 ElkhartIn46514

更新后的错误结果

StreetCityStateZip
4210 Nw Lake DrLees SummitMo64064
9810 Scripps Lake Dr. Suite A San DiegoCa - 92131Ca92131
1124 Ethel StGlendaleCa91207
4000 E Bristol St Ste 3 ElkhartIn-46514In46514

问题根源

核心问题出在Pandas的update()方法特性上:它默认只更新目标DataFrame中,与源DataFrame对应位置的非空值。你把Filter3_df的City列设为NaN后,执行Final.update(Filter3_df)时,原DataFrame中那两行的City值("Ca - 92131"和"In-46514")不会被NaN覆盖,因为update会跳过源中的NaN值。

解决办法

方法1:直接用索引定位赋值(推荐)

替换update()方法,通过索引直接覆盖对应行的所有列值,包括将原City设为NaN:

Final.loc[Filter3_df.index] = Filter3_df

方法2:先清空原列再用update

如果一定要用update(),需要先把原DataFrame对应行的City设为NaN,再执行更新:

Final.loc[Filter3_df.index, 'City'] = float('NaN')
Final.update(Filter3_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:39