LoginSignup
4
6

More than 5 years have passed since last update.

Python pandasでカンマタブ混じりのcsvファイルを読み込み整形する

Last updated at Posted at 2017-04-08

タブとカンマ混じりのcsvファイルの扱いで苦労したのでそのときの対応をメモ。
csvファイルをテキストエディタで開くと次のようになっていた。

txt
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で同じディレクトリにファイルがあるとする。

In
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列目に入るように読み込まれてしまった。

Out
    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

タブ区切りで別々の列に分けるために以下を実行。

In
df = df[0].apply(lambda x: pd.Series(x.split('\t')))

# DataFrameの中身を確認
print(df)
print(df.dtypes)
Out
    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文を回す。

In
for i in range(df.shape[1]):
    df[i] = df[i].astype(float)

# DataFrameの中身を確認
print(df.dtypes)
Out
0    float64
1    float64
2    float64
3    float64
dtype: object

これで完了。


**補足1
フォルダ配下に置いたファイルを読み込むようにしたい場合は次のようにするとできた。

In
import pandas as pd
import os

# ディレクトリをファイルがあるフォルダに変更する必要がある。
os.chdir("./ファルダ名")

# ファイル一覧をリストで取得する。
file = os.listdir("./")

# file[0]でファイル名を取得する(1ファイルのみ存在する前提)
df = pd.read_csv(file[0],header=None)

**補足2
調べたらastypeの引数は辞書型でも行けるらしい。
異なる型に変換する場合は便利そう。

In
df.astype({'a': int, 'c': str}).dtypes

**補足3
column名を入れる場合、columnを追加する場合は次を実行。

In
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"」を使う方法を試しましたが、カンマ混じりで読み込んでしまいました。

Out
     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の引数を再設定してやり直すと、ツールが自動で判別してくれるのでしょうか。分かりません。

In
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)
Out
     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"を指定するとカンマ混じりで読み込まれる場合
4
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6