Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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に変更する
haru1977
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away