You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:37