首页 > 解决方案 > 按参数列表过滤数据帧

问题描述

得到一个像这样的DataFrame:

pd.DataFrame({"type":["type1","type1","type1","type2","type2","type2","type1/type2","type1/type2","type1/type2"],
                    "id": [1,2,3,1,2,3,1,2,3],
                    "values":[1,np.nan,7,np.nan,5,np.nan,1,1,1]})

类型 ID 价值观
类型1 1 1
类型1 2
类型1 3 7
类型2 1
类型2 2 5
类型2 3
类型1,类型2 1 1
类型1,类型2 2 1
类型1,类型2 3 1

我有一个像这样的“指南”(具有它们对应的 id 的类型):

type1 = [1,3]
type2 = [2,3]
type1,type2 = [1,2,3]

我想根据此列表过滤行(您可以看到可能有两种情况: type1-id2 = NaN 需要过滤,但 type2-id3=NaN - 是一个有效值)

我怎样才能以最佳方式执行此操作?事实上,我有更大的桌子和更多的指南列表。

标签: pythonpandas

解决方案


创建从类型到有效 ID 的映射:

d = {'type1':[1, 3], 'type2':[2, 3], 'type1/type2': [1, 2, 3]}

然后为要保留的 id 创建布尔映射:

keep_bool = [id in d[type] for type, id in zip(df['type'], df['id'])]

然后只保留有效的索引。

df = df[keep_bool]

输入:

        type  id  values
0        type1   1     1.0
1        type1   2     NaN
2        type1   3     7.0
3        type2   1     NaN
4        type2   2     5.0
5        type2   3     NaN
6  type1/type2   1     1.0
7  type1/type2   2     1.0
8  type1/type2   3     1.0

输出:

>>> df[keep_bool]
          type  id  values
0        type1   1     1.0
2        type1   3     7.0
4        type2   2     5.0
5        type2   3     NaN
6  type1/type2   1     1.0
7  type1/type2   2     1.0
8  type1/type2   3     1.0

推荐阅读