2013-06-20 60 views
1

我有一些看起來像這樣的實驗數據 - http://paste2.org/YzJL4e1b(太長了,不能在這裏發表)。由字段名稱行隔開的塊是同一個實驗的不同試驗 - 我想閱讀熊貓數據框中的所有內容,但將它一起存入某些試驗中(例如0,1,6,7 - 和2, 3,4,5在另一組合並)。這是因爲不同的試驗條件略有不同,我想分析這些條件之間的結果差異。我有另一個文件的不同條件的數字列表。Pandas DataFrame迭代讀取(tsv)文件

目前,我這樣做:

tracker_data = pd.DataFrame 
tracker_data = tracker_data.from_csv(bhpath+i+'_wmet.tsv', sep='\t', header=4) 
tracker_data['GazePointXLeft'] = tracker_data['GazePointXLeft'].astype(np.float64) 

但這當然一氣呵成(包括字段名行)只是讀取一切 - 如果我能巢塊莫名其妙,讓我這將是巨大的通過數字指標輕鬆訪問它們...

你有什麼想法,我怎麼能最好做到這一點?

+0

啊,我真的很接近我想。 @TheCymera,你上傳的數據究竟是如何在你的機器上?在缺少數據的情況下,第一行中的最後幾列如何處理?他們只是標籤? – TomAugspurger

+0

是的,我通過從leafpad(我的文本基本編輯器)複製/粘貼內容。但最後的列並不真的打擾我 - 這是我想要做的選擇性分檔。 – TheChymera

回答

3

你應該使用read_csv而不是from_csv *:

tracker_data = pd.read_csv(bhpath+i+'_wmet.tsv', sep='\t', header=4) 

如果你想加入這樣你可以使用CONCAT DataFrames的列表:

trackers = (pd.read_csv(bhpath+i+'_wmet.tsv', sep='\t', header=4) for i in range(?)) 
df = pd.concat(trackers) 

* 我認爲這是過時。

+0

我想你誤解了我想做的事 - 這些塊都在一個文件中 - 與我們的代碼建議的文件不同。 – TheChymera

+0

@TheChymera道歉,我誤讀。我不太清楚你在做什麼。你是否要求讀取只讀取某些列的csv? –

+0

不,我要求一種方式來讀取整個.tsv文件(沒有分隔字符串的行),但以這種方式我可以通過索引調用由這些行分隔的塊。有人認爲像3D數據框可能? – TheChymera

0

我還沒有完全搞定它,但我認爲這是因爲我如何複製/粘貼數據。試試這個,讓我知道如果它不起作用。

使用一些靈感來自this question

pat = "TimeStamp\tGazePointXLeft\tGazePointYLeft\tValidityLeft\tGazePointXRight\tGazePointYRight\tValidityRight\tGazePointX\tGazePointY\tEvent\n" 
with open('rec.txt') as infile: 
    header, names, tail = infile.read().partition(pat) 

names = names.split() # get rid of the tabs here 
all_data = tail.split(pat) 
res = [pd.read_csv(StringIO(x), sep='\t', names=names) for x in all_data] 

我們在整個文件中讀取所以這不會對大文件的工作,然後根據已知的線給列名對它進行分區。 tail只是一個包含其餘數據的字符串,所以我們可以根據名稱再分割一次。有可能比使用StringIO更好的方法,但這應該工作。

我很確定您想如何將單獨的塊連接在一起,但這會將它們留爲列表。然而,你可以從那裏連接,但你的願望。

對於較大的文件,您可能需要編寫一個生成器來讀取,直到您點擊列名並寫入一個新文件,直到再次點擊它們爲止。然後分別使用Andy的答案來閱讀這些內容。

從如何使用多個塊的單獨問題。假設你已經有了Dataframe s的列表,我稱之爲res,你可以使用熊貓的concat將它們連成一個帶有MultiIndex的單個DataFrame(同樣參見Andy發佈的鏈接)。

In [122]: df = pd.concat(res, axis=1, keys=['a', 'b', 'c']) # Use whatever makes sense for the keys 

In [123]: df.xs('TimeStamp', level=1, axis=1) 
Out[123]: 
    a b c 
0 NaN NaN NaN 
1 0.0 0.0 0.0 
2 3.3 3.3 3.3 
3 6.6 6.6 6.6 
+0

我試過使用代碼,但第三行似乎沒有工作 - 頭,名,tail = infile.read()。分區(pat)將所有數據寫入標題中,而名稱和尾部爲空。 – TheChymera

+0

玩弄拍拍。爲了確保你得到你需要的東西,嘗試'f = open('rec.txt')'和'pat = f.read()'4或5次。 'f.read()'會一次讀取一行,所以你必須刪除標題。一旦將pat分配給正確的字符串,請再試一次。 – TomAugspurger

0

我最終做了迭代。非常非常迭代。沒有別的似乎工作。

pat = 'TimeStamp GazePointXLeft GazePointYLeft ValidityLeft GazePointXRight GazePointYRight ValidityRight GazePointX GazePointY Event' 
with open(bhpath+fileid+'_wmet.tsv') as infile: 
    eye_data = infile.read().split(pat) 
    eye_data = [trial.split('\r\n') for trial in eye_data] # split at '\r' 
    for idx, trial in enumerate(eye_data): 
     trial = [row.split('\t') for row in trial] 
     eye_data[idx] = trial