訪問者数 3596 最終更新 2018-10-19 (金) 09:31:06
悩んだのでメモを残す。
%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とかできないのかな?