如何在Pandas中无需for循环将列中列表匹配值替换为nan
问题描述
现有如下DataFrame:
import pandas as pd import numpy as np test = {'x': [1.1, 1.2, 0.15, 20], 'y': [-111, -20, -1.9, -80]} df = pd.DataFrame(test)
另有数值列表 ls=[1.2, 0.15, 2.2],需要将df中"x"列与ls内数值相同的元素替换为nan。当前通过for循环实现:
for i in ls: df.loc[df['x'] == i, 'x'] = np.nan
希望找到无需for循环的实现方式,预期输出如下:
| Index | x | y |
|---|---|---|
| 0 | 1.1 | -111 |
| 1 | nan | -20 |
| 2 | nan | -1.9 |
| 3 | 20 | -80 |
无循环解决方案
方法1:使用isin()结合布尔索引
利用pandas.Series.isin()快速判断元素是否在目标列表中,再通过布尔索引赋值:
df.loc[df['x'].isin(ls), 'x'] = np.nan
df['x'].isin(ls)会返回布尔Series,标记"x"列中属于ls的元素位置,通过loc定位后批量赋值为nan。
方法2:使用replace()方法
直接调用replace()批量替换目标值:
df['x'] = df['x'].replace(ls, np.nan)
replace()支持传入列表作为替换目标,自动将"x"列中所有匹配列表内的值替换为nan。
两种方法均能实现原循环的效果,且在数据量较大时效率显著更高。
内容的提问来源于stack exchange,提问作者Luckyboy. Jupiterchen
相关产品推荐
相关产品推荐

