如何原地更新DataFrame:将指定行的'int'替换为NaN
解决方法:布尔索引结合
replace实现原地更新 首先定义原始DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'Id':[1,1,2,3],'Origin':['int','int','pot','pot'],'Origin2':['pot','int','int','int']})
问题说明
需要将Id=1的行(索引0、1)中值为'int'的元素替换为np.nan,但df.update()无法实现用NaN覆盖非NaN值,因此需要换用其他方式。
可行方案
方案1:全局目标行替换(原地更新)
直接通过布尔索引定位目标行,执行替换后赋值回原DataFrame:
# 生成Id=1的行掩码 mask = df['Id'].eq(1) # 对目标行执行替换并原地更新 df.loc[mask] = df.loc[mask].replace('int', np.nan)
执行后得到目标结果:
print(df) # Id Origin Origin2 # 0 1 NaN pot # 1 1 NaN NaN # 2 2 pot int # 3 3 pot int
方案2:指定列精准更新
如果仅需更新Origin和Origin2列,可以缩小操作范围:
cols_to_update = ['Origin', 'Origin2'] df.loc[mask, cols_to_update] = df.loc[mask, cols_to_update].replace('int', np.nan)
补充说明
df.update()的设计逻辑是仅用非NaN值更新原DataFrame,因此无法实现用NaN覆盖已有非NaN内容,而直接通过.loc定位赋值的方式可以绕过这个限制,直接完成原地更新。
内容的提问来源于stack exchange,提问作者INGl0R1AM0R1
相关产品推荐
相关产品推荐

