ASV表与元数据表相关性分析代码报错:无法计算丰度总和
解决ASV丰度与环境因子相关性分析的问题
问题核心
你的代码报错主要源于两点:
- ASV表格中存在非数值型的丰度数据,直接求和触发类型错误
- ASV表格结构未调整,无法与样本元数据正确匹配合并
修正后的完整代码
import pandas as pd from scipy.stats import pearsonr, spearmanr # 读取ASV表格:假设第一列为ASV编号,其余列为样本ID,单元格为丰度值 # 设置index_col=0将ASV列设为索引,强制丰度列为float类型,非数值转NaN asv_table = pd.read_csv( r"C:\Users\gunne\Downloads\Page1_ASV.csv", encoding='latin1', index_col=0, dtype={col: float for col in pd.read_csv(r"C:\Users\gunne\Downloads\Page1_ASV.csv", encoding='latin1').columns[1:]} ) # 读取元数据表,确保sample_id为字符串类型,避免匹配时因类型不一致失败 metadata = pd.read_csv( r"C:\Users\gunne\Downloads\2021_metadata_csv.csv", encoding='latin1', dtype={'sample_id': str} ) # 计算每个ASV的总丰度(按行求和),排序取前20个高丰度ASV asv_total_abundance = asv_table.sum(axis=1).sort_values(ascending=False) top_20_asvs = asv_total_abundance[:20].index # 筛选前20个ASV数据,转置后让行变为样本ID,列变为ASV(适配元数据合并格式) top_asv_data = asv_table.loc[top_20_asvs].T.reset_index() top_asv_data.rename(columns={'index': 'sample_id'}, inplace=True) top_asv_data['sample_id'] = top_asv_data['sample_id'].astype(str) # 合并ASV丰度数据与元数据,按sample_id匹配 merged_data = pd.merge(top_asv_data, metadata, on='sample_id', how='inner') # 筛选元数据中的数值型列(仅数值可做相关性分析) numeric_env_factors = metadata.select_dtypes(include=['int64', 'float64']).columns # 计算相关性并存储结果 results = {} for asv in top_20_asvs: for factor in numeric_env_factors: # 过滤NaN值,避免统计函数报错 valid_data = merged_data[[asv, factor]].dropna() if len(valid_data) < 3: # 样本量不足时跳过,无统计学意义 results[(asv, factor)] = {"Pearson correlation": None, "Spearman correlation": None} continue r_pearson, p_pearson = pearsonr(valid_data[asv], valid_data[factor]) r_spearman, p_spearman = spearmanr(valid_data[asv], valid_data[factor]) results[(asv, factor)] = { "Pearson correlation": round(r_pearson, 2), "Pearson p-value": round(p_pearson, 4), "Spearman correlation": round(r_spearman, 2), "Spearman p-value": round(p_spearman, 4) } # 打印分析结果 for (asv, factor), values in results.items(): print(f"{asv} vs {factor}:") print(f" Pearson: r={values['Pearson correlation']}, p={values['Pearson p-value']}") print(f" Spearman: r={values['Spearman correlation']}, p={values['Spearman p-value']}\n")
关键修改说明
ASV数据类型处理:
- 将ASV编号设为索引,避免干扰数值计算;强制丰度列为float类型,非数值内容转NaN,解决求和报错问题
丰度筛选逻辑修正:
- 按行求和(
axis=1)计算每个ASV的总丰度,这是筛选高丰度生产者的正确逻辑(每行对应一个ASV,求和为该ASV在所有样本中的总丰度)
- 按行求和(
数据结构适配:
- 转置ASV表格,让行变为样本ID,列变为ASV,确保能与元数据表的
sample_id列正确匹配合并
- 转置ASV表格,让行变为样本ID,列变为ASV,确保能与元数据表的
相关性分析优化:
- 仅对元数据中的数值型列计算相关性,跳过字符串类因子(如分组标签)
- 过滤NaN值,增加样本量判断,避免无意义的统计结果
- 同时输出相关系数与p值,p值是判断相关性显著性的核心指标
匹配一致性保证:
- 将
sample_id统一转为字符串类型,避免因整数/字符串类型不一致导致合并失败
- 将
内容的提问来源于stack exchange,提问作者Gunner32223
相关产品推荐
相关产品推荐

