2016-12-20 5 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 

私は、ファイル名に応じてパンダを使用してデータフレームとしてそれらをマージしたいので、私は4つの結果のデータフレームを持っているでしょう。そして、これらの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_ 

編集:拡張回答がより自動化されました。次のようにファイル名に基づいて

あなたはID、彼らにできることがあります:

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

更新されたコードはこのことだろう一緒にすべてを置く:

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

試して、それらをリストにすべてのdfのを追加し、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しかし、それは私のコンピュータがたくさんかかる。 –

関連する問題