繁体   English   中英

迭代读取(tsv)Pandas DataFrame文件

[英]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的回答分别阅读那些内容。

关于如何使用多个块的单独问题。 假设你已经获得了我称之为resDataframe列表,你可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM