如何筛选pandas DataFrame中指定列值属于给定数组的行,无需嵌套for循环且无NaN
问题原因分析
你现有代码出现NaN的核心原因是初始化空结果表的方式错误:用集合{'Name', 'Type', 'id'}直接创建DataFrame时,pandas会将集合元素逐行作为第一列(默认列名为0)的值,和后续拼接的Name/Type/id列结构不匹配,才会出现大量空值。此外双层for循环是完全不必要的写法,pandas内置的向量化操作可以更高效完成筛选需求。
最优实现方案
直接使用isin()方法做布尔索引筛选,一行代码即可得到预期结果:
import pandas as pd import numpy as np # 原始数据 array_id = np.array([2,4,7]) df = pd.DataFrame({'Name': ['Station', 'Sensor', 'Station', 'Sensor', 'Sensor', 'Sensor', 'Sensor'], 'Type': ['analog', 'dig', 'analog', 'analog', 'analog', 'analog', 'dig'], 'id': [1, 2, 3, 4, 5, 6, 7]}) # 核心筛选逻辑 df_select = df[df['id'].isin(array_id)].reset_index(drop=True)
执行后输出df_select即可得到你预期的结果:
Name Type id 0 Sensor dig 2 1 Sensor analog 4 2 Sensor dig 7
reset_index(drop=True)是可选操作,作用是重置结果表的行索引为连续的整数,不需要可以直接删掉。
内容的提问来源于stack exchange,提问作者Jane Borges
相关产品推荐
相关产品推荐

