タブとカンマ混じりのcsvファイルの扱いで苦労したのでそのときの対応をメモ。
csvファイルをテキストエディタで開くと次のようになっていた。
0.2, 1.01, 0.60, -0.68
0.4, 1.00, 0.67, -0.69
0.6, 1.01, 0.61, -0.72
まずはpandasのread_csvでファイルを読み込む。
ファイル名はsample.csvで同じディレクトリにファイルがあるとする。
import pandas as pd
df = pd.read_csv_("sample.csv",header = None)
# DataFrameの中身を確認
print(df)
print(df.dtypes)
ここで
df = pd.read_csv_("sample.csv",sep="\t", header = None)
とすればよかったが、それをしなかったためにタブが混在するデータが1列目に入るように読み込まれてしまった。
0
0 0.2\t1.01\t0.60\t-0.68
1 0.4\t1.00\t0.67\t-0.69
2 0.6\t1.01\t0.61\t-0.72
0 object
dtype: object
タブ区切りで別々の列に分けるために以下を実行。
df = df[0].apply(lambda x: pd.Series(x.split('\t')))
# DataFrameの中身を確認
print(df)
print(df.dtypes)
0 1 2 3
0 0.2 1.01 0.60 -0.68
1 0.4 1.00 0.67 -0.69
2 0.6 1.01 0.61 -0.72
0 object
1 object
2 object
3 object
dtype: object
この後計算を行いたいので、全てfloat型に変換する。
df.shape[1]でDataFrameの列数を取得し、range関数で列数のリストを作成してfor文を回す。
for i in range(df.shape[1]):
df[i] = df[i].astype(float)
# DataFrameの中身を確認
print(df.dtypes)
0 float64
1 float64
2 float64
3 float64
dtype: object
これで完了。
**補足1
フォルダ配下に置いたファイルを読み込むようにしたい場合は次のようにするとできた。
import pandas as pd
import os
# ディレクトリをファイルがあるフォルダに変更する必要がある。
os.chdir("./ファルダ名")
# ファイル一覧をリストで取得する。
file = os.listdir("./")
# file[0]でファイル名を取得する(1ファイルのみ存在する前提)
df = pd.read_csv(file[0],header=None)
**補足2
調べたらastypeの引数は辞書型でも行けるらしい。
異なる型に変換する場合は便利そう。
df.astype({'a': int, 'c': str}).dtypes
**補足3
column名を入れる場合、columnを追加する場合は次を実行。
from pandas import DataFrame
# column名を挿入
df.columns=['a','b','c','d']
# column名を指定してcolumnを追加
df = DataFrame(df, columns=['a','b','c','d','e'])
**20170410追記
コメントでご指摘があったので、read_csvの引数に「sep="\t"」を使う方法を試しましたが、カンマ混じりで読み込んでしまいました。
0 1 2 3
0 0.2, 1.01, 0.60, -0.68
1 0.4, 1.00, 0.67, -0.69
2 0.6, 1.01, 0.61, -0.72
しかし、そこで「sep="\t"」の記述を削除して、read_csvを行った所、splitやastype処理を行わなくても普通にfloat型として読み込んでくれました。
pycharmで実行しているのですが、sepの引数を再設定してやり直すと、ツールが自動で判別してくれるのでしょうか。分かりません。
import pandas as pd
import os ##ファイル読み込みの為
# sampleフォルダ下のcsvファイルを読み込む
os.chdir("./sample")
file = os.listdir("./")
df = pd.read_csv(file[0],header=None)
os.chdir("../")
# DataFrameの中身を確認
print(df)
print(df.dtypes)
0 1 2 3
0 0.2 1.01 0.60 -0.68
1 0.4 1.00 0.67 -0.69
2 0.6 1.01 0.61 -0.72
0 float64
1 float64
2 float64
3 float64
dtype: object
今のところ4通りの事象を確認しており、原因不明。
Pycharm使ってカンマタブ混在のデータをread_csvで読み込むと
①何もせずに正しくfloatで読み込まれる場合
②何もしないとタブ混じりで読み込まれる場合
③sep="\t" を指定すると正しくfloatで読み込まれる場合
④sep="\t"を指定するとカンマ混じりで読み込まれる場合