AIって結局何なのかよく分からないので、とりあえず100日間勉強してみた Day4
経緯についてはこちらをご参照ください。
Pandas User Guideを読んでみた #1 はこちらをご参照ください。
■本日の進捗
●Pandas User Guideを勉強
■10 minutes to pandas
前回の続きから学んでいきます。
●データの選択
この項目、下記の注釈から始まります。(#selection)
While standard Python / NumPy expressions for selecting and setting are intuitive and come in handy for interactive work, for production code, we recommend the optimized pandas data access methods,
DataFrame.at()
,DataFrame.iat()
,DataFrame.loc()
andDataFrame.iloc()
.
標準的なPythonやNumPyは直感的でデータを選択や設定したりするのに便利なんだけど、実務的にコードを書くならPandasのデータアクセスメソッドを使った方がいいっすよ?
つまりデータ操作(前処理と言った方が適切?)にはPandasを使った方がいいよってことだと解釈しました。
なお、ChatGPT大先生によると、
言語化すごい…
いまいち咀嚼できない事象があるなら今すぐこの記事もGoogle検索も閉じて大先生に聞いた方が早いですね。
要はデータを並べて理解して、前処理のために取捨選択したり変換したりはPandasで行うのがよくて、そのデータを使って数値計算するときはNumPyでやったら良いよってことですね。
●データ作成
df.locについて少し思うところがあったので検証してみました。
まず素直にUser Guideの通りにdf.locを実行すると下記のようになる。
>>> df
A B C D F
2013-01-01 0.000000 0.000000 1.112946 0.411428 NaN
2013-01-02 0.386399 0.834258 -0.226323 -1.014131 1.0
2013-01-03 1.031439 -0.093287 -0.482355 -0.450390 2.0
2013-01-04 -0.019280 -0.838047 -0.194284 0.020324 3.0
2013-01-05 1.885864 -0.209170 1.008705 0.831894 4.0
2013-01-06 -1.033895 -0.147176 0.957645 -0.479401 5.0
>>>
>>> df.loc[:, "D"] = np.array([5] * len(df))
>>> df
A B C D F
2013-01-01 0.000000 0.000000 1.112946 5 NaN
2013-01-02 0.386399 0.834258 -0.226323 5 1.0
2013-01-03 1.031439 -0.093287 -0.482355 5 2.0
2013-01-04 -0.019280 -0.838047 -0.194284 5 3.0
2013-01-05 1.885864 -0.209170 1.008705 5 4.0
2013-01-06 -1.033895 -0.147176 0.957645 5 5.0
>>>
ただ、D列に5を代入すれば全て5に入るんじゃないか?と思いました。
NumPy配列を作成することによって何か他の処理をするなら別だが、これではただ単に処理が重くなるのではないかと理解しきれなかった。
試した結果が下記の通り
>>> df
A B C D F
2013-01-01 0.000000 0.000000 0.152198 1.227513 NaN
2013-01-02 -0.984664 -2.685080 -1.286771 -1.304911 1.0
2013-01-03 -0.292644 -0.770530 -0.262709 1.593353 2.0
2013-01-04 -1.195507 0.305898 0.188110 2.384894 3.0
2013-01-05 -0.985423 2.278192 -0.013133 -0.865289 4.0
2013-01-06 0.205259 0.455475 1.267537 0.083351 5.0
>>>
>>> df.loc[:, "D"] = 5
<stdin>:1: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
>>> df
A B C D F
2013-01-01 0.000000 0.000000 0.152198 5 NaN
2013-01-02 -0.984664 -2.685080 -1.286771 5 1.0
2013-01-03 -0.292644 -0.770530 -0.262709 5 2.0
2013-01-04 -1.195507 0.305898 0.188110 5 3.0
2013-01-05 -0.985423 2.278192 -0.013133 5 4.0
2013-01-06 0.205259 0.455475 1.267537 5 5.0
>>>
なんか怒られました。
「それ、将来的にはダメにするかもだから配列にしてから代入して!」って言われてます。でもPandasさん優しいのでさっきと同じ結果を返してくれています。
>>> df.dtypes
A float64
B float64
C float64
D int64
F float64
dtype: object
>>>
ちなみに想定通りデータ型も変わらなかった。
まあ、こういう横着はやめておいた方がいいんでしょうね…
●欠損データを除外する
DataFrameの中に欠損データがある場合、それを簡単に除外することができる。
他の分野ではどうか分からないが、科学計算や実験においては非常に重要な操作になる。
User Guide通りに実行すると下記の通り
>>> df1
A B C D F E
2013-01-01 0.000000 0.000000 0.152198 5 NaN 1.0
2013-01-02 -0.984664 -2.685080 -1.286771 5 1.0 1.0
2013-01-03 -0.292644 -0.770530 -0.262709 5 2.0 NaN
2013-01-04 -1.195507 0.305898 0.188110 5 3.0 NaN
>>>
>>> df1.dropna(how="any")
A B C D F E
2013-01-02 -0.984664 -2.68508 -1.286771 5 1.0 1.0
>>>
ほぼ消えた。
引数howには2通りの指定ができて、anyとallがあるらしい。
- anyはどこか1つでもNaNがあればその行または列を削除する
- allはすべての要素がNaNである行または列を削除する
ジャパニーズ的にはallでほとんど消えないのは違和感があるかもしれないが、「どう(how)いう時に消す?」という引数だと思えば理解しやすい。
●DataFrameのMerge
#concatの項目に下記の注意書きがあった。
Adding a column to a DataFrame is relatively fast. However, adding a row requires a copy, and may be expensive. We recommend passing a pre-built list of records to the DataFrame constructor instead of building a DataFrame by iteratively appending records to it.
DataFrameに列を追加するのは比較的早いけど、列を追加するのにはcopyが必要になるのでコストがかかるんよ。だから予めリスト化してからDataFrameを作った方がいいよ。って言ってます。
DataFrameの再構築は無駄に重くなるので、データ量が大規模なものに関しては行はfor文などで追加していくのはやめて、(せめてインデックスは)全てのデータを構築してからDataFrameを構築するようにしましょう。
■おわりに
次回、Pandas3日目、10 minutes to pandas ようやく半分です。
あれ?何分経った…?
■参考文献
- pandas user guide – pandas v2.2.2 documentation. pandas.pydata.org. 2024. https://pandas.pydata.org/docs/user_guide/index.html
- ChatGPT. 4o mini. OpenAI. 2024.
https://chatgpt.com/