2016-12-20 2 views
1

다음 명명 규칙을 사용하여 여러 파일이 있습니다.파일 이름으로 데이터 프레임 병합

ENCSR000EQO_0_0.txt 
ENCSR000DIA_0_0.txt 
ENCSR000DIA_1_1.txt 
ENCSR000DIA_2_1.txt 
ENCSR000DIM_0_0.txt 
ENCSR000DIM_1_1.txt 
ENCSR000AIB_0_0.txt 
ENCSR000AIB_1_1.txt 
ENCSR000AIB_2_1.txt 
ENCSR000AIB_3_1.txt 

나는 파일 이름에 따라 팬더를 사용 dataframes로를 병합 할, 그래서 4 결과 dataframes있을 것입니다. 그리고이 4 가지 각각에 대해 유전자 (GeneName) 열을 그룹화하려고합니다. 동일한 유전자가 여러 번 나타날 것이기 때문에.

이들 모두 동일한 순서로 같은 열을 갖습니다. 한 번에 10 개를 모두 병합 할 수 있지만 이름으로 병합하는 방법을 알 수는 없습니다.

path = '/renamed/' 

print os.listdir(path) 

df_merge = None 
for fname in os.listdir(path): 
    if fname.endswith('.txt'): 
     df = pd.read_csv(path + fname, sep='\t', header=0) 
     df.columns = ['ID ', 'Chr', 'Start', 'End', 'Strand', 'Peak Score', 'Focus Ratio/Region Size', 
        'Ann', 'DetAnn', 'Distance', 'PromoterID', 'EID', 
        'Unigene', 'Refseq', 'Ensembl', 'GeneName', 'GeneAlias', 
        'GeneDescription', 'GeneType'] 
     df = df.groupby('GeneName').agg(np.mean) 
     print df 

입력 해 주셔서 감사합니다.

+0

당신이 뭔가이라고합니다' 가입하십시오. 'pd.merge'를 찾는다. –

+0

아마 [이 게시물] (http://stackoverflow.com/questions/23668427/pandas-joining-multiple-dataframes-on-columns) 도움이 될 것입니다. – lmo

답변

2

, 각각을 점검 한 다음, 연결된 결과를 그룹화하십시오.

import glob 
path = 'renamed' 

df_merge = None 
for fid in ('EQO', 'DIA', 'DIM', 'AIB'): 
    df_ = pd.DataFrame() 
    for fname in glob.glob(os.path.join(path, '*.txt')): 
     if fid in fname: 
      df = pd.read_csv(fname, sep='\t', header=0) 
      df.columns = ['ID ', 'Chr', 'Start', 'End', 'Strand', 'Peak Score', 'Focus Ratio/Region Size', 
         'Ann', 'DetAnn', 'Distance', 'PromoterID', 'EID', 
         'Unigene', 'Refseq', 'Ensembl', 'GeneName', 'GeneAlias', 
         'GeneDescription', 'GeneType'] 
      df_ = pd.concat((df_, df)) 
    df_ = df_.groupby('GeneName').agg(np.mean) 
    print df_ 

편집 : 확장 답변이 더욱 자동화됩니다.

import numpy as np 
files = glob.glob(os.path.join(path, '*.txt')) 
fids = np.unique([file.split('_')[0] for file in files]) 

업데이트 된 코드는이 것 모두 함께 퍼팅 : 다음과 같이 파일 이름을 바탕으로

당신은 ID를 할 수있을 것 내가 생각

import glob 
import numpy as np 
path = 'renamed' 

files = glob.glob(os.path.join(path, '*.txt')) 
fids = np.unique([file.split('_')[0] for file in files]) 

df_merge = None 
for fid in fids: 
    df_ = pd.DataFrame() 
    for fname in files: 
     if fid in fname: 
      df = pd.read_csv(fname, sep='\t', header=0) 
      df.columns = ['ID ', 'Chr', 'Start', 'End', 'Strand', 'Peak Score', 'Focus Ratio/Region Size', 
         'Ann', 'DetAnn', 'Distance', 'PromoterID', 'EID', 
         'Unigene', 'Refseq', 'Ensembl', 'GeneName', 'GeneAlias', 
         'GeneDescription', 'GeneType'] 
      df_ = pd.concat((df_, df)) 
    df_ = df_.groupby('GeneName').agg(np.mean) 
    print df_ 
+0

나는 glob에 익숙하지 않다. 그것은 흥미로운 가능성처럼 보이지만이 경우에는 실제로 100000 개의 파일과 많은 파일 이름 변형이 있습니다. –

+0

Glob은 여전히 ​​유용 할 것이며 표준 라이브러리의 일부입니다. 내 확장 답변을 참조하십시오. 성능을 위해 – AlexG

+2

을 사용하면 모든 DF를 목록에 저장하고 끝까지 'concat'을 연기하는 것이 좋습니다. –

1

시도를 목록에 모든 안양의를 추가하고 CONCAT, 컬럼으로 파일 이름을 추가하고 그룹 : 난 당신이 파일 이름을 얻을 수 glob을 사용할 수 있습니다 더 이런 일을 할 것

df_merge = [] 
for fname in os.listdir(path): 
if fname.endswith('.txt'): 
    df = pd.read_csv(path + fname, sep='\t', header=0) 
    df.columns = ['ID ', 'Chr', 'Start', 'End', 'Strand', 'Peak  Score', 'Focus Ratio/Region Size', 
       'Ann', 'DetAnn', 'Distance', 'PromoterID', 'EID', 
       'Unigene', 'Refseq', 'Ensembl', 'GeneName', 'GeneAlias', 
       'GeneDescription', 'GeneType'] 
    df['fname'] = [fname.split('_')[0] for x in df.index] #just to multiple by length 
    df_merge.append(df) 

df_all = pd.concat(df_merge) 

for fn in set(df_all['fname'].values):  
    print df_all[df_all['fname']==fn].groupby('GeneName').agg(np.mean) 
+0

이것은 훌륭한 솔루션입니다. 내가 왜 그런 생각을하지 않았을까? hehe 그러나 그것은 내 컴퓨터를 많이 걸립니다. –

관련 문제