2017-11-08 11 views
0

次のデータフレームからカウントを生成するPythonスクリプトを作成しようとしています。私はExcelでcountifsを使用していましたが、 'Sample'と 'Region'に重複しているためcountifsの使用に問題があります。条件が真の場合、パンダは一意にカウントされます。

例入力DFは:

Sample Chr Start End Region Size Strand Chr2 Start2 End2 Coverage Overlap 
101 chr1 198661465 198661475 NM_002838_PTPRC_intron_2_R 10 + chr1 198608563 198661471 0 6 
101 chr1 198661465 198661475 NM_001267798_PTPRC_intron_2_R 10 + chr1 198608563 198661471 0 6 
101 chr1 198661465 198661475 NM_080921_PTPRC_intron_2_R 10 + chr1 198608563 198661471 0 6 
101 chr1 236966727 236966942 NM_000254_MTR_cds_2 215 + chr1 236966742 236966743 11 1 
101 chr1 236966727 236966942 NM_001291939_MTR_cds_2 215 + chr1 236966742 236966743 11 1 
101 chr1 236966742 236966942 NM_001291940_MTR_5utr_2 200 + chr1 236966742 236966743 11 1 
101 chr1 236979843 236979853 NM_000254_MTR_intron_8_L 10 + chr1 236979846 236979847 9 1 
101 chr1 236979843 236979853 NM_000254_MTR_intron_8_L 10 + chr1 236979847 236979848 8 1 
101 chr1 236979843 236979853 NM_000254_MTR_intron_8_L 10 + chr1 236979848 236979852 7 4 
101 chr1 236979843 236979853 NM_000254_MTR_intron_8_L 10 + chr1 236979852 236979854 6 1 
101 chr1 236979843 236979853 NM_001291940_MTR_intron_8_L 10 + chr1 236979846 236979847 9 1 
101 chr1 236979843 236979853 NM_001291940_MTR_intron_8_L 10 + chr1 236979847 236979848 8 1 
101 chr1 236979843 236979853 NM_001291940_MTR_intron_8_L 10 + chr1 236979848 236979852 7 4 

ので、単一のサンプルが複数回列挙された同じ「リージョン」を持つことができます(別の座標を、それはカウントのために重要ではありません)。

所望の出力1 - 'サンプル' でカウント '領域は、' "UTR" または "イントロン" または "CDS"、 'サンプル' あたりの重複 '領域' の会計処理が含まれている場合:

Sample Total Intron UTR CDS 
101 68 40 13 15 
102 64 38 13 13 

所望の出力2 - 「サンプル」で「重複」の合計「領域は、」「UTR」または「イントロン」または「CDS」が含まれている場合:

Sample Total Intron UTR CDS 
101 2838 321 1433 1084 
102 2524 291 1449 784 

所望の出力3 - レジオ」の一覧リージョン 『」それとサンプル数のカウントと』 nが記載されている

Region Num Samples 
ENST00000390559_IGHM_cds_4 2 
ENST00000390559_IGMH_cds_1 2 
ENST00000390559_IGMH_cds_2 2 
ENST00000390559_IGMH_cds_3 12 
ENST00000390559_IGMH_intron_1_L 2 
ENST00000390559_IGMH_intron_1_R 2 
ENST00000390559_IGMH_intron_2_L 10 

EDIT: 私は出力#3を取得する方法を考え出した:

df.groupby('Region').Sample.nunique() 

を、私は、出力のための総取得することができます#1:

df.groupby('Sample').Region.nunique() 

今私はちょうど「UTR/CDS /イントロン」を含む、そして濾過グループの「オーバーラップ」を合計するための私のグループをフィルタリングする方法を理解する必要があります。

答えて

0

誰もが同様の問題に遭遇している場合は、ここで説明した3つの出力を生成するために考えています。最も洗練されたソリューションではないかもしれませんが、機能します!

import pandas as pd 
import argparse 
import os 
import sys 

#arguments 
parser = argparse.ArgumentParser(description="Generate counts by sample and total bases by sample of low coverage regions") 

parser.add_argument("-i", "--input", help="input filename", required=True) 
parser.add_argument("-o", "--output", help="output basename", required=True) 

args = parser.parse_args() 

#output filenames 
region_count_file = args.output + "_region_count.txt" 
bases_count_file = args.output + "_bases_count.txt" 
sample_count_file = args.output + "_sample_count.txt" 

#read in 
df = pd.read_table(args.input) 

#check output doesn't exist 
if os.path.exists(region_count_file) or os.path.exists(bases_count_file) or os.path.exists(sample_count_file): 
    sys.exit("ERROR: output basename %s files already exist" % args.output) 

#for filtering on different regions 
intron = df['Region'].str.contains('intron') 
utr = df['Region'].str.contains('utr') 
cds = df['Region'].str.contains('cds') 

#count regions per sample 
unique_regions = df.groupby('Sample').Region.nunique() 
unique_intron = df[intron].groupby('Sample').Region.nunique() 
unique_utr = df[utr].groupby('Sample').Region.nunique() 
unique_cds = df[cds].groupby('Sample').Region.nunique() 

#sum bases per sample 
bases_total = df.groupby(['Sample'])['Overlap'].sum() 
bases_intron = df[intron].groupby(['Sample'])['Overlap'].sum() 
bases_utr = df[utr].groupby(['Sample'])['Overlap'].sum() 
bases_cds = df[cds].groupby(['Sample'])['Overlap'].sum() 

#count samples per region 
samples_per_region = df.groupby('Region').Sample.nunique() 

#format regions per sample for output 
combine_region_count = pd.concat([unique_regions,unique_intron,unique_utr,unique_cds], axis=1) 
combine_region_count.columns = 'Total','Intron','UTR','CDS' 

#format bases per sample for output 
combine_bases = pd.concat([bases_total,bases_intron,bases_utr,bases_cds], axis=1) 
combine_bases.columns = 'Total','Intron','UTR','CDS' 

#format samples per region for output 
#samples_per_region.reset_index(name='Num Samples') 
#not sure why this is not working, but not that important 


#output each 
combine_region_count.to_csv(region_count_file,sep='\t') 
combine_bases.to_csv(bases_count_file,sep='\t') 
samples_per_region.to_csv(sample_count_file,sep='\t') 
関連する問題