如何过滤DataFrame的列表列,保留首字母为A/B/D的元素并筛选行
过滤DataFrame中姓名列表:保留首字母为A/B/D的元素并移除空行
问题场景
现有如下DataFrame:
ID Names 3 [Ally, Ben, Cris] 5 [Bruno, Coleen, Flyn] 2 [Dave, Bob] 7 [Rob, Ally, Bob] 11 [Jill, Tom, Sal]
需求说明:
- 对
Names列的姓名列表进行过滤,仅保留首字母为A、B或D的姓名 - 移除过滤后
Names列为空列表的行
最终期望输出:
ID Names 3 [Ally, Ben] 5 [Bruno] 2 [Dave, Bob] 7 [Ally, Bob]
可复现输入代码:
import pandas as pd df = pd.DataFrame({'ID': [3, 5, 2, 7, 11], 'Names': [['Ally', 'Ben', 'Cris'], ['Bruno', 'Coleen', 'Flyn'], ['Dave', 'Bob'], ['Rob', 'Ally', 'Bob'], ['Jill', 'Tom', 'Sal']] })
解决方法
通过apply方法对列表元素进行过滤,再筛选非空行即可实现需求:
代码实现
# 定义过滤逻辑:保留首字母为A/B/D的姓名 def filter_names(names_list): allowed_initials = {'A', 'B', 'D'} return [name for name in names_list if name[0] in allowed_initials] # 对Names列应用过滤规则 df['Names'] = df['Names'].apply(filter_names) # 过滤掉过滤后为空列表的行,重置索引 df = df[df['Names'].str.len() > 0].reset_index(drop=True) # 输出结果 print(df)
运行结果
ID Names 0 3 [Ally, Ben] 1 5 [Bruno] 2 2 [Dave, Bob] 3 7 [Ally, Bob]
补充说明
如果需要兼容姓名首字母小写的情况,可修改过滤条件为name[0].upper() in allowed_initials,确保大小写不影响过滤结果。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

