ノート/ノート

訪問者数 3596      最終更新 2018-10-19 (金) 09:31:06

Pandasで空DFを作って後からintを代入する件

悩んだのでメモを残す。

%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型にすればよい。

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

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-19 (金) 09:31:06 (1622d)