拼接Pandas DataFrame时如何保留原始数据类型?
保留DataFrame拼接时的原始数据类型
我需要拼接两个DataFrame:mut为整数数据类型,mirna为浮点数据类型。但拼接后的合并DataFrame将所有值强制转换为浮点类型。相关代码如下:
mut.insert(len(mut.columns), "category", 0, True) mut = mut.dropna() mirna.insert(len(mirna.columns), "category", 1, True) mirna = mirna.dropna() df = pd.concat([mut, mirna])
mut数据示例:
pd.DataFrame({'TCGA-2Z-A9J1-01A': {'IGF2R': 1, 'NBEA': 1, 'KMT2D': 0, 'HERC2': 0}, 'TCGA-2Z-A9J3-01A': {'IGF2R': 0, 'NBEA': 0, 'KMT2D': 0, 'HERC2': 0}, 'TCGA-2Z-A9J5-01A': {'IGF2R': 0, 'NBEA': 0, 'KMT2D': 0, 'HERC2': 1}, 'TCGA-2Z-A9J6-01A': {'IGF2R': 0, 'NBEA': 0, 'KMT2D': 0, 'HERC2': 0}})
mirna数据示例:
pd.DataFrame({'TCGA-2Z-A9J1-01A': {'hsa-let-7a-3p': 2.436967295678264, 'hsa-let-7b-5p': 3.6676128143486753, 'hsa-let-7b-3p': 1.958120697018377, 'hsa-let-7c-5p': 3.3710754357912336}, 'TCGA-2Z-A9J3-01A': {'hsa-let-7a-3p': 1.8616291060705468, 'hsa-let-7b-5p': 3.5952286310865538, 'hsa-let-7b-3p': 1.7737597007222166, 'hsa-let-7c-5p': 3.4958162915921864}, 'TCGA-2Z-A9J5-01A': {'hsa-let-7a-3p': 2.13165245798285, 'hsa-let-7b-5p': 3.682127909644228, 'hsa-let-7b-3p': 1.914741202547229, 'hsa-let-7c-5p': 3.5227245438834998}, 'TCGA-2Z-A9J6-01A': {'hsa-let-7a-3p': 2.1191074673269097, 'hsa-let-7b-5p': 3.6612699717201993, 'hsa-let-7b-3p': 2.123077968206283, 'hsa-let-7c-5p': 3.5324296559039428}})
问题原因
pd.concat拼接列不重叠的DataFrame时,缺失列的位置会填充NaN。而标准整数类型(int64)无法存储NaN,pandas会自动将这类列转为浮点类型(float64)以兼容缺失值。
解决方法
使用pandas的**可空整数类型(Int64,注意大写I)**替换标准整数类型,该类型支持存储NaN且保留整数的类型属性。浮点列保持原有类型即可。
修改后的代码:
# 将mut的所有整数列转换为可空整数类型 mut = mut.astype('Int64') mut.insert(len(mut.columns), "category", 0, True) mut = mut.dropna() mirna.insert(len(mirna.columns), "category", 1, True) mirna = mirna.dropna() # 拼接后保留原始类型 df = pd.concat([mut, mirna])
验证类型:执行df.dtypes可以看到,原mut的列类型为Int64,原mirna的列类型为float64,category列也可根据需求设为Int64。
注意:可空整数类型要求pandas版本≥1.0.0,若版本过低请先升级pandas。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

