こんにちは、駄犬です。もう夏だ!と思うと急に寒くなったりで服装に困ってる今日この頃です。
最近pythonの辞書やリストを使ってデータ抽出をする機会が増えたので、その方法を2つ備忘として記事にしたいなと思います。
今回はpandasを使って実践してみました。
本記事はpythonやプログラミングにあまり馴染がない初心者の方でもわかるように、できるだけやさしく書こうと思います。
【内容】
- データ内に辞書の特定の値が入っていたときに、keyの名前でフラグをつけたい
- 多次元のリストを一次元化する
1.データ内に辞書の特定の値が入っていたときに、keyの名前でフラグをつけたい
下図のようなテーブルがあります。
それぞれのショップでどの種類の動物が何匹売れたか?みたいなペットショップのデータだと思ってください。
今回はこのテーブル「animal_tbl」を使って実際に動かしていきたいと思います。
やりたいこと:細かい種類しかわからないので、犬なのか?猫なのか?別の動物なのか?…を判別するフラグを作りたい
① 下図のような辞書を用意します。
② kinds_col の データの中身を見て、辞書内のリストに該当する生き物であれば、そのkeyの名前のフラグを作る
shibaだったらdog_flg、mikeだったらcat_flgを作りたいですが、いちいち書くのは面倒なのでループさせたいです。以下のように書きます。
このように key, value in 辞書.items() と指定すると、辞書の中のkeyとvalueを抜き出してあげることができます。
※ keyというのは辞書のワードのこと、valueはそのワードの中身を指します。keyが大カテゴリでvalueが小カテゴリと思うとイメージしやすいかもしれません。
test_dictの辞書はdogから始まってsnakeで終わっているので、4回繰り返されることになります。
つまり、1回目の実行でanimalにはdogが、kindsには[柴犬・ゴールデン・ハスキー・ボルゾイ]のリストが代入されている状態になります。
なので「テーブルのkind_colの中に、柴犬・ゴールデン・ハスキー・ボルゾイのデータがあったら、それは犬なのでdog_flgに1を入れてね そうでない場合は0を入れてください」という意味になります。
これを実行すると以下のようになります。
こんな(フラグ分け)ことしないで、1つのカラムで犬猫判別できるクラスみたいなの作ればいいじゃん って声が聞こえてきそうですが、実際の分析ではフラグで持たせた方が重宝する場合が多かったりするので、まあまあ使えるんじゃないかなという気がします。
2. 多次元のリストを一次元化する
多次元リストってなんだなんだと驚かれたかもしれませんが、リストの中にリストが入れ子で入っていたり、先ほどの辞書のように複数リストを持っている状態を指します。
先ほどのペットショップのデータを使ってやってみましょう。
① 取り扱いフラグを作ろう
この架空のペットショップでは、来年販売できる取り扱い動物が以下の動物だけということが判明しました。(そんなことないかもしれませんが、あくまで架空の話なので大目に見てください。)
とにかく来年の売り上げにどの程度影響があるのか調べたいです。
今回はkinds_colのデータが、動物の種類を問わず辞書内の値(value)であれば取り扱いフラグ1を立てたいです。
だけど辞書内に複数リストがあって(多次元リストの状態)、このままだと指定がしにくいです。そこでこの多次元リストを一次元化(1つのリスト)にしてしまいましょう。
② itertools をimportしよう
itertoolsというパッケージをimportします。このパッケージの中に入ってるchainモジュールの「from_iterable」を使います。
以下のように書くと、辞書の中身だけを取り出して1つのリストにまとめてくれます。
③ テーブルにflagを実際につくっていこう
今回はループさせる必要はないので、ループはせず先ほどと同じ方法でカラムを追加します。
一番最後に「sellable_flg」が追加されました。ハスキーやロシアンに1が、柴犬やゴールデンに0がふられています。
せっかくなので、今作ったフラグごとに今年何匹売れたのかを見てみましょう。
おしまいに
今回はpythonの辞書型を使ったデータ抽出方法についてご紹介しました。
特に2つ目の多次元リストを1次元化する方法は、実際に業務で直面し、いい方法ないかな~と調べて最近得たほやほやの方法だったりします。あまりに便利なので最近非常によく使ってます。結構汎用性高い方法な気がするので、何かのお役に立てば幸いです!
まもなくやってくる憂鬱な6月をなんとか乗り切りましょう、それでは~