LoginSignup
83
88

More than 5 years have passed since last update.

pandasでデータを読み込むときに気を付けること(dtypeの指定)

Last updated at Posted at 2016-11-06

pandasでデータを読む場合、dtypeは指定したほうが安全

この記事ではpandas 0.18.1を利用しています。

dtypeに何も指定せずにいると、勝手に型を判別してしまいます。
例えば以下のようなタブ区切りのデータがあった場合

data_1.txt

id  x01 x02 x03 x04 x05 x06 x07 x08 x09 x10
0001    0.54    0.54    0.85    0.79    0.54    0.36    0.28    0.52    0.21    0.49
0002    0.72    0.68    0.77    0.69    0.07    na  0.29    0.42    0.32    0.51
0003    0.68    0.99    0.19    0.16    0.31    0.76    0.57    0.08    0.07    0.98
0004    0.98    na  0.49    0.47    0.09    0.52    0.42    0.35    0.83    0.64
0005    0.37    0.35    0.99    0.88    0.81    0.46    0.57    0.47    0.06    0.55
# coding: UTF-8

import pandas as pd
df = pd.read_csv('‪data_1.txt', header = 0, sep = '\t', na_values = 'na')
print df
    id  x01 x02 x03 x04 x05 x06 x07 x08 x09 x10
0   1   0.54    0.54    0.85    0.79    0.54    0.36    0.28    0.52    0.21    0.49
1   2   0.72    0.68    0.77    0.69    0.07    NaN 0.29    0.42    0.32    0.51
2   3   0.68    0.99    0.19    0.16    0.31    0.76    0.57    0.08    0.07    0.98
3   4   0.98    NaN 0.49    0.47    0.09    0.52    0.42    0.35    0.83    0.64
4   5   0.37    0.35    0.99    0.88    0.81    0.46    0.57    0.47    0.06    0.55

型を指定しないと、上のようになってしまい、idのゼロが落ちます。
df.dtypes でidのデータ型を確認するとintになってしまっています。

このような場合は、

df = pd.read_csv('data_1.txt', header = 0, sep = '\t', na_values = 'na',
                 dtype = {'id':'object', 'x01':'float', 'x02':'float','x03':'float','x04':'float','x05':'float','x06':'float',
                          'x07':'float','x08':'float','x09':'float','x10':'float'})

print df
     id   x01   x02   x03   x04   x05   x06   x07   x08   x09   x10
0  0001  0.54  0.54  0.85  0.79  0.54  0.36  0.28  0.52  0.21  0.49
1  0002  0.72  0.68  0.77  0.69  0.07   NaN  0.29  0.42  0.32  0.51
2  0003  0.68  0.99  0.19  0.16  0.31  0.76  0.57  0.08  0.07  0.98
3  0004  0.98   NaN  0.49  0.47  0.09  0.52  0.42  0.35  0.83  0.64
4  0005  0.37  0.35  0.99  0.88  0.81  0.46  0.57  0.47  0.06  0.55

このように、dtypeを指定するともとの形を保持できます。RでいうcolClasses ですね。
dtype を指定したほうが、データの読み込みが早い気もします。

また、とりあえず最初は全てobjectで読んでおいて、後から必要な個所のみ変更することもできます。

# 最初はすべてobjectで読む
df = pd.read_csv('data_1.txt', header = 0, sep = '\t', na_values = 'na', dtype = 'object')

var_lst = ['x01','x02','x03','x04','x05','x06','x07','x08','x09','x10']
df[var_lst] = df[var_lst].astype(float)    # データ型をfloatに変更する
83
88
0

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
83
88