python - 按参数列表过滤数据帧
问题描述
得到一个像这样的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 - 是一个有效值)
我怎样才能以最佳方式执行此操作?事实上,我有更大的桌子和更多的指南列表。
解决方案
创建从类型到有效 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
推荐阅读
- sql - 设计一个数据库来容纳一维数据
- azure-devops - 如何找出 Azure DevOps Services 管道需求/能力要求以选择某些特定代理?(隐式和显式要求)
- python - 忽略命令无异常:discord.ext.commands.errors.CommandNotFound:找不到命令“send_dm”
- c++11 - 二分法如何找到x1和x2?
- javascript - 有没有办法导入文本文件并将其显示到网页上,但也可以对文本文件的每一行进行特定更改?
- jquery - 如何为每个视频设置videojs currentTime
- javascript - Popunder 自动运行
- terraform - 使用 Terraform 在 Aazure Postgresql 上设置警报的问题
- python - 错误 - 执行时 - JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
- java - 在构造函数中使用 JAXB