Python按Label列分组CSV数据:拆分0/1标签至不同DataFrame
解决CSV按列Label分组为DataFrame的问题
看起来你之前的代码误解了CSV的结构——你的Label是对应样本列的标记(第一行的1/0对应第二行的P_ERR161等样本列),而不是DataFrame中每行的一个列。这就是为什么之前的代码无法正确分组的原因。
下面是完整的解决方案,分步骤帮你把数据按Label=1和Label=0分成两个独立的DataFrame,方便后续统计检验:
步骤1:正确读取数据并提取Label信息
首先我们需要单独读取CSV的第一行获取每个样本列的Label,再读取剩余行作为实际数据:
import pandas as pd # 读取第一行的Label信息 with open('final_out_transposed.csv', 'r') as f: label_line = f.readline().strip().split() # 提取样本列对应的Label(跳过第一个"Label"字符串) sample_labels = [int(label) for label in label_line[1:]] sample_names = label_line[1:] # 样本列名,比如P_ERR161、P_ERR162等 # 读取CSV的剩余内容,用第二行作为列名 df = pd.read_csv('final_out_transposed.csv', header=1)
步骤2:按Label筛选样本列并创建分组DataFrame
接下来我们建立样本列和Label的映射,然后分别筛选出Label=1和Label=0的列,生成两个DataFrame(保留TaxID作为标识列):
# 建立样本列与Label的映射字典 sample_label_map = dict(zip(sample_names, sample_labels)) # 筛选Label=1(case组)和Label=0(control组)的样本列 case_sample_cols = [col for col in sample_names if sample_label_map[col] == 1] ctrl_sample_cols = [col for col in sample_names if sample_label_map[col] == 0] # 创建两个分组DataFrame,保留TaxID列 case_df = df[['TaxID'] + case_sample_cols].copy() ctrl_df = df[['TaxID'] + ctrl_sample_cols].copy()
现在case_df就是所有Label=1的样本列数据,ctrl_df是Label=0的样本列数据,你可以直接用它们做t检验、Wilcoxon秩和检验等分析。
可选:整理数据格式方便统计检验
如果需要对每个TaxID的两组数据做统计检验,建议把数据转成长格式(long format),这样更方便使用scipy.stats的检验函数:
from scipy import stats # 将两个DataFrame转成长格式 case_long = case_df.melt(id_vars='TaxID', var_name='Sample', value_name='Value') case_long['Group'] = 'Case' ctrl_long = ctrl_df.melt(id_vars='TaxID', var_name='Sample', value_name='Value') ctrl_long['Group'] = 'Control' # 合并成一个完整的长格式DataFrame combined_df = pd.concat([case_long, ctrl_long], ignore_index=True) # 对每个TaxID执行t检验和Wilcoxon秩和检验 stat_results = [] for taxid in df['TaxID'].unique(): # 获取当前TaxID的两组数据 case_vals = combined_df[(combined_df['TaxID'] == taxid) & (combined_df['Group'] == 'Case')]['Value'].values ctrl_vals = combined_df[(combined_df['TaxID'] == taxid) & (combined_df['Group'] == 'Control')]['Value'].values # 跳过样本量不足的情况(检验需要至少2个样本) if len(case_vals) < 2 or len(ctrl_vals) < 2: continue # 执行检验 t_stat, t_pval = stats.ttest_ind(case_vals, ctrl_vals) wilcox_stat, wilcox_pval = stats.ranksums(case_vals, ctrl_vals) stat_results.append({ 'TaxID': taxid, 't_statistic': t_stat, 't_p_value': t_pval, 'wilcox_statistic': wilcox_stat, 'wilcox_p_value': wilcox_pval }) # 把结果转成DataFrame results_df = pd.DataFrame(stat_results)
这样你就得到了每个TaxID的统计检验结果,可以直接查看或进一步分析。
内容的提问来源于stack exchange,提问作者K.S
相关产品推荐
相关产品推荐

