我有以下数据框,
Subtpe_sam_ID
Subtype_sam_REL
Subytpe_sam_ph
Tab_sam_ID
Tab_sam_REL
Tab_sam_ph
Subtype.sam_ID.head()
chr start end ratio name
ch1 334 456 0.1 SAP
chr2 789 788 0.6 SOP
和
`Tab_sam_ID.head()`
chr start end cgid
chr1 334 456 cgt780
chr4 789 0.7 cg899
chr2 789 788 cg899
对于上面的示例,和我想要的输出必须是与Tab_subtype_sam_ID_merge
它看起来应该是,
Tab_subtype_sam_ID_merge.head() #as the name of the saved file
chr start end ratio name cgid
chr1 334 456 0.1 SAP cgt780
所以我为此编写了以下代码,
path = './Analysis/'
files = os.listdir(path)
Tab = [os.path.join(path,i) for i in files if i.startswith('Tab')]
path = '/'
files = os.listdir(path)
Sub = [os.path.join(path,i) for i in files if i.startswith('Subtype')]
for tab,homer in zip(Tab,Sub):
df1=pd.read_csv(homer,sep='\t')
df2=pd.read_csv(tab,sep='\t')
name1 = os.path.basename(os.path.normpath(homer))
name2 = os.path.basename(os.path.normpath(tab))
如果列start
和chr
匹配Tab和子类型数据框,则合并文件的逻辑。
但是从这里我无法弄清楚我怎么能根据他们的名字合并两个文件,所以我会有3个结果数据帧。例如,如果数据帧Subtpe_sam_ID等于Tab_sam_ID(这里我的意思是字符串的最后部分等于这些数据帧中的每一个,即ID和ID),则在列chr和Start上合并。然后用一个通用名称保存。
以子类型开头的所有数据框都以相同的顺序具有相同的列,因此对于Tab _ *。
> if basename(name1)==basename(name2)
> merge=pd.merge(df1,df2,on=['chr','Start'])
> dirname=os.path.dirname(os.path.normpath(filename))
> merge.to_csv(dirname +merge+ name, sep='\t',index=False)
任何建议或帮助都会很棒.. !!!!
答案 0 :(得分:1)
您可以尝试这种方式:
import os
import pandas as pd
path = 'E:/mypc/tab_data/'
files = os.listdir(path)
Tab = [os.path.join(path,i) for i in files if i.startswith('Tab')]
path = 'E:/mypc/subtype_data/'
files = os.listdir(path)
Sub = [os.path.join(path,i) for i in files if i.startswith('Subtype')]
dirname = "E:/mypc/output/"
for i in Tab:
for j in Sub:
if "_".join(j.split("/")[-1].split("_")[1:]) == "_".join(i.split("/")[-1].split("_")[1:]):
name = i.split("/")[-1].split("_")[0] + "_" + j.split("/")[-1]
f = [j,i]
df1=pd.read_csv(f[0])
df2=pd.read_csv(f[1])
merged_df = pd.merge(df1,df2,on=['chr','start'], suffixes=('','_')).T.drop_duplicates().T
merged_df.to_csv(dirname + name , index=False)