多条件过滤Pandas DataFrame:保留含指定列表单个元素的行
Pandas DataFrame过滤:仅保留含目标列表单个元素的行
问题背景
现有Pandas DataFrame,需过滤掉两类行:
- 未包含目标列表中任何元素的行
- 包含目标列表中多个元素的行
仅保留恰好包含目标列表一个元素的行
修正后的DataFrame与目标列表
先修正原代码的语法错误,构造可用的数据结构:
import pandas as pd df = pd.DataFrame({ 'Name': ['John', 'Mark', 'Kevin', 'Ron', 'Amira'], 'ID': [110, 111, 112, 113, 114], 'Job title': ['xox','xoy','xoz','yow','uyt'], 'Manager': ['River', 'Trevor', 'John', 'Lydia', 'Connor'], 'M2': ['Shaun', 'Mary', 'Ronald', 'Cary', 'Miranda'], 'M3': ['Clavis', 'Sharon', 'Randall', 'Mark', 'Doug'], 'M4': ['Pat', 'Karen', 'Brad', 'Chad', 'Anita'], 'M5': ['Ty', 'Jared', 'Bill', 'William', 'Bob'], 'Location': ['US', 'US', 'JP', 'CN', 'JA'] }) target_list = ['River', 'Pat', 'Brad', 'William', 'Clogah']
过滤实现代码
通过统计每行匹配目标列表的元素数量,筛选出数量为1的行:
# 计算每行中属于目标列表的元素个数 match_count = df.isin(target_list).sum(axis=1) # 筛选仅含1个目标元素的行 filtered_df = df[match_count == 1]
过滤结果
执行后得到的filtered_df为:
Name ID Job title Manager M2 M3 M4 M5 Location 2 Kevin 112 xoz John Ronald Randall Brad Bill JP 3 Ron 113 yow Lydia Cary Mark Chad William CN
代码说明
df.isin(target_list):生成布尔矩阵,标记每个元素是否属于目标列表.sum(axis=1):按行求和,得到每行匹配目标元素的总个数df[match_count == 1]:通过布尔索引,仅保留恰好匹配1个目标元素的行
内容的提问来源于stack exchange,提问作者achi00
相关产品推荐
相关产品推荐

