如何在Snakemake规则中对输入文件用Python iloc提取指定列首值?
解决Snakemake规则中从压缩sumstats文件提取列首值的问题
下面提供两种可行的方法,其中shell命令的方式更高效,适合处理大型GWAS汇总统计文件:
方法一:用shell命令直接提取(推荐)
不需要依赖Python Pandas,直接用zcat和awk快速定位目标列的首个值,避免读取整个大文件:
rule convert_file: input: "sumstats/{prefix}.txt.gz" output: "sumstats/{prefix}.sumstats.gz" shell: ''' munge_sumstats.py --chunksize 50000 \ --sumstats {input} \ --N $(zcat {input} | awk -v col="colname" 'NR==1{for(i=1;i<=NF;i++) if($i==col) c=i} NR==2{print $c; exit}') \ --out {output} '''
- 核心逻辑:先解压文件内容,第一行遍历表头找到目标列的索引,第二行直接输出该列的值后退出,节省内存和时间。
方法二:用Python实现类似iloc的逻辑
如果习惯用Pandas处理数据,可以在Snakemake规则中用run块替代shell,直接读取文件提取值:
rule convert_file: input: "sumstats/{prefix}.txt.gz" output: "sumstats/{prefix}.sumstats.gz" run: import pandas as pd # 仅读取第一行数据(避免加载整个大文件) df = pd.read_csv(input[0], sep='\t', compression='gzip', nrows=1) n_value = df['colname'].iloc[0] # 执行shell命令 shell(f''' munge_sumstats.py --chunksize 50000 \ --sumstats {input} \ --N {n_value} \ --out {output} ''')
- 注意:如果你的sumstats文件分隔符不是制表符,需要调整
sep参数匹配实际格式。
内容的提问来源于stack exchange,提问作者KKK
相关产品推荐
相关产品推荐

