2017-05-19 106 views
0

我有多個製表符分隔的文件,全部具有相同的條目。我打算讀取每個文件選擇第一列作爲索引。我的最終表將有第一列作爲索引映射到所有文件的最後一列。爲此,我編寫了一個熊貓代碼,但不是很棒的代碼。有沒有其他方法可以做到這一點?通過熊貓的Accumalate列

import pandas as pd 
df1 = pd.read_csv("FB_test.tsv",sep='\t') 
df1_idx = df1.set_index('target_id') 
df1_idx.drop(df1_idx[['length','eff_length','est_counts']],inplace=True, axis=1) 
print(df1_idx) 
df2 = pd.read_csv("Myc_test.tsv",sep='\t') 
df2_idx = df2.set_index('target_id') 
df2_idx.drop(df2_idx[['length','eff_length','est_counts']],inplace=True, axis=1) 
print(df2_idx) 
frames = [df1_idx, df2_idx] 
results = pd.concat(frames, axis=1) 
results 

它產生的輸出是,

  tpm 
target_id  
A   0 
B   0 
C   0 
D   0 
E   0 
      tpm 
target_id  
A   1 
B   1 
C   1 
D   1 
E   1 
Out[18]: 
target_id tpm tpm  
A 0 1 
B 0 1 
C 0 1 
D 0 1 
E 0 1 

如何循環它,這樣,我看每個文件和實現這一相同的輸出?

感謝, AP

回答

1

我認爲你可以使用參數index_colusecolsread_csvlist comprehension。但得到重複列名(因此是選擇的問題),所以最好是添加參數keysconcat - 轉換Multiindex得到很好獨特的列名之後:

files = ["FB_test.tsv", "Myc_test.tsv"] 
dfs = [pd.read_csv(f,sep='\t', index_col=['target_id'], usecols=['target_id','tpm']) 
     for f in files] 
results = pd.concat(dfs, axis=1, keys=('a','b')) 
results.columns = results.columns.map('_'.join) 
results = results.reset_index() 
print (results) 
    target_id a_tpm b_tpm 
0   A  0  1 
1   B  0  1 
2   C  0  1 
3   D  0  1 
4   E  0  1 
1

清潔代碼,並使用循環機制,可以把兩個文件的名字和你在兩個單獨的列表被丟棄列,然後使用列表中理解上的文件名導入每個數據集。隨後,您將列表理解的輸出連接成一個數據幀:

import pandas as pd 


drop_cols = ['length','eff_length','est_counts'] 
filenames = ["FB_test.tsv", "Myc_test.tsv"] 
results = pd.concat([pd.read_csv(filename,sep='\t').set_index('target_id').drop(drop_cols, axis=1) for filename in filenames], axis=1) 

我希望這有助於。