Python中移除DataFrame的CHROM列chr字符串的正确方法
解决Pandas中CHROM列移除chr字符串时生成NaN的问题
你的DataFrame中CHROM列是混合类型(包含整数和字符串),直接用str.replace会导致非字符串类型的元素被转为NaN——因为str系列方法仅对字符串类型生效,非字符串元素会被识别为缺失值。
解决方案一:统一转为字符串后替换,再转回整数
先将整列转为字符串类型,确保所有元素都能被字符串处理方法识别,替换完成后再转回整数类型,保持列数据类型一致:
import pandas as pd data_as_dict={'CHROM': {232: 1, 233: 1, 234: 1, 10: 'chr15', 11: 'chr15'}, 'POS_GRCh38': {232: 10506158, 233: 109655507, 234: 113903258, 10: '67165147', 11: '67163292'}, 'REF': {232: 'G', 233: 'CAAA', 234: 'G', 10: 'G', 11: 'C'}, 'Effect_allele': {232: 'A', 233: 'C', 234: 'A', 10: 'C', 11: 'T'}, 'Effect_size': {232: 0.1109, 233: 0.0266, 234: 0.0579, 10: 0.2070141693843261, 11: 0.2151113796169455}, 'TYPE': {232: 'Mavaddat_2019_ER_NEG_Breast', 233: 'Mavaddat_2019_ER_NEG_Breast', 234: 'Mavaddat_2019_ER_NEG_Breast', 10: 'THYROID_PGS', 11: 'THYROID_PGS'}, 'Cancer': {232: 'Breast', 233: 'Breast', 234: 'Breast', 10: 'THYROID', 11: 'THYROID'}, 'Significant_YN': {232: 'Y', 233: 'Y', 234: 'Y', 10: 'Y', 11: 'Y'}} all_cancers = pd.DataFrame.from_dict(data_as_dict) # 核心处理代码 all_cancers['CHROM'] = all_cancers['CHROM'].astype(str).str.replace(r'chr', '', regex=True).astype(int)
解决方案二:用apply自定义处理逻辑
通过apply遍历每个元素,针对性处理字符串类型的元素,非字符串元素直接保留,最后统一转整数:
def clean_chrom(x): if isinstance(x, str): return x.replace('chr', '') return x all_cancers['CHROM'] = all_cancers['CHROM'].apply(clean_chrom).astype(int)
两种方法处理后,CHROM列的结果都会变为:
| index | CHROM |
|---|---|
| 232 | 1 |
| 233 | 1 |
| 234 | 1 |
| 10 | 15 |
| 11 | 15 |
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

