1

我有一些看起来像这样的实验数据 - http://paste2.org/YzJL4e1b(这里发布太长了)。由字段名称行分隔的块是同一实验的不同试验 - 我想读取 pandas 数据框中的所有内容,但将其组合在一起某些试验(例如 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) 

但这当然只是一口气读取所有内容(包括字段名称行)-如果我可以以某种方式嵌套块,这使我可以通过数字索引轻松访问它们,那就太好了...

你有什么想法我怎么能最好地做到这一点?

4

3 回答 3

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)

*我认为已弃用。

于 2013-06-20T14:24:06.427 回答
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 更好的方法,但这应该可行。

我注意到您希望如何将单独的块连接在一起,但这会将它们保留为列表。您可以根据需要从那里连接。

对于较大的文件,您可能需要编写一个生成器来读取,直到您点击列名并写入一个新文件,直到您再次点击它们。然后使用像安迪的答案这样的东西单独阅读这些内容。

一个与如何使用多个块一起工作的单独问题。假设你有Dataframe我称之为 s的列表res,你可以使用 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
于 2013-06-20T19:26:36.353 回答
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
于 2013-07-10T01:12:18.797 回答