pandas.dataframeからilocを用いて必要なデータだけを抜き出した際に表示されるワーニングについて教えてください。
pandasのデータフレーム(df2)から必要な行列だけを抜き出すために、下記のような操作をした際に表示されるワーニングについて。
df2 = df.iloc[0:3201,:]
#必要なデータだけ抜き出し
df2 = df2.astype(float)
#データ型変更:実数
df_index = df2.iloc[:,0]
df_alfa = df2.iloc[:,np.arange(1, 27, 3)]
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
ilocではなく、locで”カラム名で指定”を推奨していることなのでしょうか?
計算、グラフ作成は問題なくできているのですが、気になっております。
<質問追記2018/10/16>
magichansさんへ
プログラムを再度確認してみると、
上記ではなく下記のところで表示されているエラーのようです(すみません)。
次のような計算にすすみ、
index=df_alfa.index
ave = df_alfa.mean(axis=1)
std = df_alfa.std(axis=1)
ここまで問題なし。
次の2行でをアクティブにするとエラーが表示されるとわかりました。
df_alfa["ave"] = ave
df_alfa["STD"] = std
平均と標準偏差を行毎に算出して、
その計算結果を元のデータフレームdf_alfaに追加するために、上記を行なっています。
その後、グラフ化へ。。
ここの指定の方法に問題ありますでしょうか?
Yasuhiroさんへ
<質問追記2018/10/16>
もともと読み込んだデータの一部の行列に"NaN"や"Int"が含まれていて、floatで読み込みたい数値がobjectになっていたため、NaNやIntの処理後に必要なデータ全体を一括float指定するために行った操作です。ここはオリジナルデータ(df2)を上書き変更していると思っておりましたが、コピーが生成されるということなのですね?オリジナルを上書きする方法はございますか?もしくは、
df3 = df2.astype(float)
と別名にした方が賢明?? 混同・思い違いを避けるために。
Yasuhiroさんへ
<質問追記2018/10/16 その2>
ありがとうございます。
df2 = df.iloc[0:3201,:]
df2 = df2.astype(float) #ここでコピーが作成される
df2 = df2.set_index(0)
df_alfa = df2.iloc[:,np.arange(1, 27, 3)]
df2["ave"] = df_alfa.mean(axis=1)
df2["STD"] = df_alfa.std(axis=1)
についてですが、最終的には必要な列をピックアップした”df_alfa”に
、”df_alfa"のデータから算出した”ave”と”STD”の2列を追加して"df_alfa"を可視化
という流れが私のやりたいことなのですが、その場合、上記の最後の2行は、
df_alfa["ave"] = df_alfa.mean(axis=1)
df_alfa["STD"] = df_alfa.std(axis=1)
と変更しても大丈夫ですか?
なんとなく不安なので、一旦、データフレーム外に算出して(書き出して)、
計算後にそれら2列を追加したのですが。
"平均と標準偏差の計算"と"2つの列の追加”の処理がぶつからないかと心配??
もし、そうであれば(邪魔するのであれば)、
ave = df_alfa.mean(axis=1)
std = df_alfa.std(axis=1)
として、その後
df_alfa["ave"] = ave
df_alfa["STD"] = std
と2段階で2列を追加した方が賢明??
(10/16 20:00時点:こちらで上記についてプログラム走らせて確認した結果、2段階に分けてしないと計算結果が合いませんでした。)
そもそもここで、index,ave,stdを書き出したのは、後のmatplotlib.pyplotでの
データ可視化(グラフに表示させる)のために指定しました。
ax = fig.add_subplot(111)
ax.plot(index, ave)
ax.errorbar(index,ave,yerr=std,...)
ここで、pandasのDataFrame.plotを使えば、こんな指定は必要なく、
DataFrameの列名で指定できるので簡単なのですが...。
エラーバーの表示でpandasのplotで上手く行かない事があり..
この件は、別に質問あげる予定です。