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

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 に答える
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のリストを持っていると仮定すると、pandas のconcatresを使用してそれらを結合し、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 に答える