我发现了根据条件替换数据帧的某些值的两种形式:
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])
两种形式都可以很好地工作,但是哪种形式更合适?关于这个问题,我什么时候应该使用 .loc ,什么时候 np.where ?
答案 0 :(得分:1)
嗯,这不是一个全面的测试,但这是一个示例。在每次运行(loc
,np.where
)中,数据都被重置为带有种子的原始随机数。
在这里,np.nan
比有效值更多。而且,该列是浮点型的。
np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice((1, np.nan), 1000000, p=(0.3,0.7))})
# loc
%%timeit
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
# 46.7 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# np.where
%%timeit
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])
# 86.8 ms ± 2.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
此处np.nan
少于有效值,并且该列属于对象类型:
np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice(("1", np.nan), 1000000, p=(0.7,0.3))})
相同的故事:
df.loc[mask, 'param'] = 'new_value'
# 47.8 ms ± 350 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
df['param'] = np.where(mask, 'new_value', df['param'])
# 58.9 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
因此与@ cs95的评论相反,loc
的表现似乎胜过np.where
。