使用过滤后的DataFrame更新原DataFrame后旧值重现的问题排查
问题分析:Pandas DataFrame.update() 未正确覆盖空值列
初始DataFrame数据
| Street | City | State | Zip |
|---|---|---|---|
| 4210 Nw Lake Dr | Lees Summit | Mo | 64064 |
| 9810 Scripps Lake Dr. Suite A San Diego | Ca - 92131 | ||
| 1124 Ethel St | Glendale | Ca | 91207 |
| 4000 E Bristol St Ste 3 Elkhart | In-46514 |
预期输出
| Street | City | State | Zip |
|---|---|---|---|
| 4210 Nw Lake Dr | Lees Summit | Mo | 64064 |
| 9810 Scripps Lake Dr. Suite A San Diego | Ca | 92131 | |
| 1124 Ethel St | Glendale | Ca | 91207 |
| 4000 E Bristol St Ste 3 Elkhart | In | 46514 |
执行代码
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数据
| Street | City | State | Zip |
|---|---|---|---|
| 9810 Scripps Lake Dr. Suite A San Diego | Ca | 92131 | |
| 4000 E Bristol St Ste 3 Elkhart | In | 46514 |
更新后的错误结果
| Street | City | State | Zip |
|---|---|---|---|
| 4210 Nw Lake Dr | Lees Summit | Mo | 64064 |
| 9810 Scripps Lake Dr. Suite A San Diego | Ca - 92131 | Ca | 92131 |
| 1124 Ethel St | Glendale | Ca | 91207 |
| 4000 E Bristol St Ste 3 Elkhart | In-46514 | In | 46514 |
问题根源
核心问题出在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
相关产品推荐
相关产品推荐

