如何在Pandas中筛选同一单元格内带分隔符的数值数据
Pandas筛选含多值的Object列中满足条件的行
问题背景
有10000条数据,第三列CADD_phred为object类型,单元格包含三种格式:
.:代表空值- 单个数值(如
12.25) - 逗号分隔的多个数值(如
12,45,12.5)
需要筛选出该列中至少存在一个数值大于10的行。
解决方案
直接分割后逐个判断效率较低,推荐用apply结合数值转换的方式生成筛选掩码,具体步骤如下:
1. 加载示例数据
import pandas as pd data = {'POS': {0: 20482821, 1: 20482980, 2: 20483463, 3: 20485526, 4: 20485536, 5: 20485630, 6: 20485811, 7: 20485948, 8: 109274570, 9: 109274623, 10: 109274677, 11: 109274857, 12: 109274968, 13: 109275216, 14: 109275325, 15: 109275506, 16: 109275536, 17: 109275600, 18: 109275641, 19: 109275648, 20: 109275684, 21: 197042891, 22: 197042926, 23: 197043092, 24: 197043111}, 'CHROM': {0: 'chr1', 1: 'chr1', 2: 'chr1', 3: 'chr1', 4: 'chr1', 5: 'chr1', 6: 'chr1', 7: 'chr1', 8: 'chr1', 9: 'chr1', 10: 'chr1', 11: 'chr1', 12: 'chr1', 13: 'chr1', 14: 'chr1', 15: 'chr1', 16: 'chr1', 17: 'chr1', 18: 'chr1', 19: 'chr1', 20: 'chr1', 21: 'chr3', 22: 'chr3', 23: 'chr3', 24: 'chr3'}, 'CADD_phred': {0: 14.27, 1: '.', 2: '.', 3: 17.1, 4: 17.61, 5: '20.1,19.64', 6: 15.99, 7: 15.95, 8: 1.551, 9: 5.142, 10: 14.05, 11: 6.579, 12: 1.225, 13: 14.38, 14: 5.841, 15: 3.85, 16: 4.373, 17: '.', 18: 16.95, 19: 16.94, 20: 3.067, 21: '.', 22: 5.925, 23: 10.3, 24: 9.495}} df = pd.DataFrame(data)
2. 生成筛选掩码
# 定义判断函数:检查单元格是否有大于10的数值 def has_value_gt10(x): if pd.isna(x) or x == '.': return False # 处理单个数值或逗号分隔的多数值 values = str(x).split(',') try: # 转换为浮点数,判断是否存在大于10的值 return any(float(v) > 10 for v in values) except ValueError: # 遇到非数值内容直接返回False return False # 生成布尔掩码 mask = df['CADD_phred'].apply(has_value_gt10)
3. 筛选目标数据
filtered_df = df[mask]
关键说明
- 空值处理:把
.和NaN统一视为不满足条件,直接返回False - 类型转换:强制把每个分割后的字符串转成浮点数,确保数值判断准确
- 异常处理:避免单元格出现非数值字符串导致报错
- 效率优化:
apply结合生成器表达式的方式,在10000条数据上运行效率足够
内容的提问来源于stack exchange,提问作者Lukas Chumchal
相关产品推荐
相关产品推荐

