[英]iteratively read (tsv) file for Pandas DataFrame
我有一些看起來像這樣的實驗數據 - http://paste2.org/YzJL4e1b (這里發布的時間太長了)。 由字段名稱行分隔的塊是同一個實驗的不同試驗 - 我想在大熊貓數據框中讀取所有內容但是將它們放在一起進行某些試驗(例如0,1,6,7一起使用 - 和2, 3,4,5在另一組中一起拍攝)。 這是因為不同的試驗條件略有不同,我想分析這些條件之間的結果差異。 我有一個來自另一個文件的不同條件的數字列表。
目前我這樣做:
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)
但這當然只是一次性讀取所有內容(包括字段名稱行) - 如果我可以以某種方式嵌套塊,這將允許我通過數字索引輕松訪問它們將是很好的...
你有什么想法我怎么能做到最好嗎?
你應該使用read_csv
而不是from_csv
*:
tracker_data = pd.read_csv(bhpath+i+'_wmet.tsv', sep='\t', header=4)
如果你想加入像這樣的DataFrames列表,你可以使用concat:
trackers = (pd.read_csv(bhpath+i+'_wmet.tsv', sep='\t', header=4) for i in range(?))
df = pd.concat(trackers)
* 我認為已被棄用。
我還沒有完成它,但我認為這是因為我如何復制/粘貼數據。 試試這個,讓我知道它是否不起作用。
從這個問題中汲取靈感
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的回答分別閱讀那些內容。
關於如何使用多個塊的單獨問題。 假設你已經獲得了我稱之為res
的Dataframe
列表,你可以使用pandas的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
我最終迭代地做了。 非常非常迭代。 似乎沒有其他工作。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.