1. ホーム
  2. パイソン

[解決済み] 複数のテーブルを含む.datファイルをpandasのデータフレームに読み込むにはどうしたらいいですか?

2022-03-04 09:30:05

質問

私は、raw_data.dat のような .dat ファイルにデータを記録する測定器を持っています。 このフォルダ そして、ファイルの最後のテーブルをpandasのデータフレームに抽出できるようにしたいのです。

このファイルにはいくつかの表があり、ここの表組み構造が.datファイルの標準であるかどうかは分かりませんが、テキストをエクセルに貼り付けてみると、テキストは個別の表として認識されるので、おそらくパイソンに構造を正しく読み込むためのかなり標準的な方法があると思われます。私はそれを見つけることができなかったので、本当に複雑な方法を試してみました。.datファイルを文字列に読み込んで、手動でファイルの一部のトップを切り落とし、残りを.datファイルとして保存しました。私の希望は、何とかして結果を.csvまたは.xlsとして保存できるようにすることですが、それを行う方法がまだ見つかっていません。さらに、インポートした後、集計が "absolute "に変換され、保存されたファイルでは集計に戻りません。そのための私のコードは以下の通りです。


mylines = []                             
with open ('raw_file.dat', 'rt') as myfile:
    for myline in myfile:
        mylines.append(myline)

string = (mylines[8:])

with open("updated.dat", "w") as output:
    output.write(str(string))


私はpythonにかなり慣れていないので、関数を正しく使えるかどうか確信が持てないことを認めざるを得ません。それでも、私が試みている回避策よりも、もっと簡単な方法があることを望みます。

どのように解決するのですか?

欲しいテーブルが8行目から始まることが確認できれば、ファイルを8行目から順にインデックス付けする以上の複雑なことをする必要はない。そこから、文字列操作とリスト内包を使ってデータをきれいにすることができるのです。

import pandas as pd

# Read the data.
with open('raw_data.dat', 'r') as fh:
    lines = fh.readlines()[8:]

# Remove newlines, tabs, and split each string separated by spaces.
clean = [line.strip.replace('\t', '').split() for line in lines]

# Feed the data into a DataFrame.
data = pd.DataFrame(clean[1:], columns=clean[0])

を出力します。

               Time         Variab1e1  ...               v18               v19
0  +0.00000000e+000  +3.04142181e-002  ...  +0.00000000e+000  +0.00000000e+000
1  +1.00000000e+000  +1.96144191e-001  ...  +1.00000000e+000  +0.00000000e+000
2  +2.00000000e+000  +3.75599731e-001  ...  +2.00000000e+000  +0.00000000e+000

値を浮動小数点に変換したい場合は、データをDataFrameに変換する前に行います。

headers = clean[0]
rows = [[float(value) for value in row] for row in clean[1:]]

data = pd.DataFrame(rows, columns=headers)

で、よりすっきりしたフレームになります。

   Time  Variab1e1  Variable2  Variable3  Variable4  ...  v15  v16   v17  v18  v19
0   0.0   0.030414        0.0   1.383808        0.0  ...  0.0  0.0  15.0  0.0  0.0
1   1.0   0.196144        1.0   7.660262        1.0  ...  0.0  1.0  15.0  1.0  0.0
2   2.0   0.375600        2.0  15.356726        2.0  ...  0.0  2.0  15.0  2.0  0.0