[[ノート/ノート]]~

訪問者数 &counter();      最終更新 &lastmod();

*Pandasで空DFを作って後からintを代入する件 [#f2f1984f]

悩んだのでメモを残す。

 %matplotlib inline
 import pandas as pd
 import matplotlib.pyplot as plt
 a = pd.DataFrame(index=range(10), columns=['x','y'])
 for i in range(10):
     a.at[i,'x'] = i
     a.at[i,'y'] = i**2
 a.plot.scatter(x='x', y='y')
 plt.show()
が、エラーを起こした。
 ValueError: scatter requires x column to be numeric

でa.dtypesを探ると、
 x    object
 y    object
 dtype: object
のように、dtypeがobjectだった。文字列?

おもしろいのは、
 for i in range(10):
     #a.at[i,'x'] = i
     #a.at[i,'y'] = i**2
     a.loc[i,'x'] = i
     a.loc[i,'y'] = i**2
としたら直ったのだが、atの問題とも思えない。

dtypeを考えると、こんなことらしい。
 a = pd.DataFrame(index=range(10), columns=['x','y'])
でできるのは、空のDFだが、要素はすべてNaNになっている。NaNはfloat64型の要素。

で、
 a.at[i,'x'] = 整数
で書込んでも、理由はよくわからないのだが、(intでなく)objectになっているわけで、a.locだとなぜか右辺の整数型で置き換えられているらしい。

それで、きちんとするのならば、DFに値を書込む前にint型にすればよい。
-案1 DataFrame生成時にdtype=intを指定する ⇒ これは不可。なぜなら要素の値を指定しないのでNaNを入れるから勝手にfloat型になってしまう。
-案2 DataFrame生成後(NaNが入っている)に、a.astype(int)でint型に変換する ⇒ これも不可。要素の値がNaNであるのにastype(int)をすると変換できずエラーになる。
-案3 DataFrame生成直後に、fillna(0)のようにNaNを0に変換してしまう ⇒ これなら動く

というわけで、案3を使うか、前にうまく行った a.loc[i,'x'] = i を使うか、さもなければ初めからDFを生成する時の初期値を指定するか(np.arrayで作っておくとか)、ぐらいが可能そうな気がする。
というわけで、案3を使うか、前にうまく行った a.loc[i,'x'] = i を使うか、さもなければ初めからDFを生成する時の初期値を指定するか(numpy.zeros() で作っておくとか)、ぐらいが可能そうな気がする。

それにしても、DF生成時に、NumPyのようにオール0とかできないのかな?

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS