Pythonでデータ処理 #1
はじめてのPython
ではないけど予備知識はほぼ0。簡潔にまとめるために基本文法は省いて、ファイルの読み込みや形式の書き換えなど、やりたいことをどうすればできるかのみをまとめる。
1.ファイル読み込み
1.1)とりあえず1行ずつ読み込んでみる
f=open('./data/1', 'r')
p0=f.readline()
print(p0)
f.close()
このコードは別の記事で作成したデータファイルの1行目を読み取り表示する。
open関数の第一引数は開きたいファイルのパスで、第二引数は読み取りや書き込みなどのモードである。
readline関数により開いたファイルの1行目が変数p0にリストとして格納される。
実際に実行すると'./data/1'の1行目が表示された。
0 0.000000 0.000000 0.000000
表示は間違っていないがリスト内にどのように格納されているかを知るために、次のコードを作成し実行した。
f=open('./data/1', 'r')
p0=f.readline()
for i in p0:
print(i,'\n')
f.close()
これにより、読み取った1行目のデータをどこで分割しているかを知ることができる。
0
0
.
0
0
0
0
0
0
0
.
0
0
0
0
0
0
0
.
0
0
0
0
0
0
1文字ずつ読み取っていた。文字列として扱ってタブ区切りで結合すれば使いやすくはなるが、このままでは不便である。
1.2)pandasを用いてファイルを読み込む
pandasというモジュール内にある関数read_tableがタブ区切りのファイルを読み取るのに向いている。
p0=pd.read_table('./data/1', header=None)
print(p0)
これだけ。headerという引数をNoneに設定することでファイルにheaderがないことを示している。これがないと不都合なことが起こるのでそうしている。
このコードを実行すると次のような実行結果が出る。
0 1 2 3
0 0 0.0 0.0 0.0
1 1 0.0 0.0 12.0
2 2 0.0 0.0 24.0
3 3 0.0 0.0 36.0
4 4 0.0 0.0 48.0
親切にも列番号と行番号を表示してくれている。さてリストの要素ごとに出力させてみよう。
p0=pd.read_table('./data/1', header=None)
for i in range(5):
for j in range(4):
print(p0[j][i],'\n')
実行結果は以下に記す
0
0.0
0.0
0.0
1
0.0
0.0
12.0
2
0.0
0.0
24.0
3
0.0
0.0
36.0
4
0.0
0.0
48.0
行番号と列番号は含まれておらず、あくまでリストの要素の中はファイルの中身のみとのことだ。これで中身をいじりやすくなった。
1.3)index付きの読み込み
headerだけでなくindexもあるらしい。今回はちょうど関節番号というindexがあるので使ってみよう。
p0=pd.read_table('./data/1', header=None, index_col=0)
print(p0)
index_colにindexにする列番号を代入すると以下のように表示される。
1 2 3
0
0 0.0 0.0 0.0
1 0.0 0.0 12.0
2 0.0 0.0 24.0
3 0.0 0.0 36.0
4 0.0 0.0 48.0
なんかheaderがずれているが配列の中身が座標のみになっているなら良しとしましょう。この感じなら1列目がX座標、2列目がY座標、3列目がZ座標となっている気がする。一応見ておこう。
p0=pd.read_table('./data/1', header=None, index_col=0)
print(p0[1])
print(p0[2])
print(p0[3])
0
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
Name: 1, dtype: float64
0
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
Name: 2, dtype: float64
0
0 0.0
1 12.0
2 24.0
3 36.0
4 48.0
Name: 3, dtype: float64
p0[0]を表示させようとするとエラーが出る。1行目から3行目までが取り出したい座標の値になっている。
2.出力
2.1)タブ区切りのファイルを出力する
じゃあX座標だけのファイルを作っちゃおう。この後のことを考えるとX座標が横並びになった方が便利だと思うので、そうしよう。
p0=pd.read_table('./data/1', header=None, index_col=0)
p1=pd.read_table('./data/26', header=None, index_col=0)
px={}
f=open('./test.txt', 'w')
for i in range(5):
print(str(p0[1][i]), str(p1[1][i]), sep='\t', file=f)
f.close()
はい。print関数でファイルに書き込みできるということを初めて知りました。
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.204445
test.txt
今回はここまで
参考
https://note.nkmk.me/python-pandas-to-csv/
https://aiacademy.jp/media/?p=152
https://utokyo-ipp.github.io/4/4-1.html
この記事が気に入ったらサポートをしてみませんか?