我有一些看起来像这样的实验数据 - 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)
但这当然只是一次性读取所有内容(包括字段名称行) - 如果我可以以某种方式嵌套块,这将允许我通过数字索引轻松访问它们,这将是很好的...
你有什么想法我最好能做到这一点吗?
答案 0 :(得分:3)
您应该使用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)
我认为* 已被弃用。
答案 1 :(得分:0)
我还没有完成它,但我认为这是因为我如何复制/粘贴数据。试试这个,如果它不起作用,请告诉我。
的灵感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
的列表,我称之为res
,您可以使用pandas'concat将它们连接在一起,形成一个带有MultiIndex的DataFrame(另见链接安迪发布了。)
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
答案 2 :(得分: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