Pandas技术问题:提取DataFrame列中字符串元素的代码无效,求解决方法
问题排查与解决建议
咱们先揪出几个可能导致代码失效的原因,再逐个解决:
1. 列名拼写错误(最容易忽略的坑)
你代码里写的是ndf['LDU'],但问题里的目标列是Column2——如果这不是笔误的话,那代码根本没在处理正确的列,自然会返回不符合预期的结果!先确认列名是否完全匹配。
2. basestring只适用于Python 2,Python 3已移除
basestring是Python 2中用来统一判断字符串(str/unicode)的父类,但Python 3里已经没有这个类型了,所有字符串都是str类型。如果你的代码运行在Python 3环境下,isinstance(i, basestring)会失去判断作用,导致结果不符合预期。换成Python 3兼容的写法:
# Python 3 下正确的字符串判断 my_list = [i for i in ndf['Column2'] if isinstance(i, str)]
3. 先确认列中元素的实际类型
有时候DataFrame的object类型列会混合存储数值和字符串,但也有可能那些“数值”其实是字符串形式的(比如'1.246982'),这时候isinstance(i, str)会把它们也纳入结果。先跑一行代码看看元素类型分布:
print(ndf['Column2'].apply(type).value_counts())
如果发现那些数值确实是字符串类型,那需要额外过滤掉纯数字字符串。利用你的数据特征:基因名要么是单个名称,要么是逗号分隔的多个名称,完全不会是纯数字。可以写个小函数来判断:
def is_valid_gene_entry(entry): if not isinstance(entry, str): return False # 两种情况:包含逗号(多基因),或者不是纯数字字符串 return ',' in entry or not entry.replace('.', '', 1).isdigit() my_list = [i for i in ndf['Column2'] if is_valid_gene_entry(i)]
测试验证
用你给出的DataFrame示例,上面的代码会返回:['BMS1P17,BMS1P18,BMS1P22,DUXAP8', 'LINC01297', 'POTEH,POTEH-AS1', 'HDHD5,HDHD5-AS1', 'LOC101929372,SLC25A18'],完全符合你的需求。
内容的提问来源于stack exchange,提问作者RJF
相关产品推荐
相关产品推荐

