【Python】pandasを使ってみる
こんばんは、葛の葉です。
ここ最近はPyQ
というサービスを使ってPythonの勉強をしています。環境構築とかがなくても、Webブラウザ上ですぐに学べるのがいいところだと思います。月3000円とネットフリックスと言った娯楽サービスの月額料金と比べるとお高い感じがしますが、参考書1冊分だと思えば安い方だと思います。私はどちらかというと手を動かして覚えたい方ですので、こういったコードを書きながら学べるサービスは非常に良いと思いました。
さて、私は現在、データ分析のコースをプレイしております。そのうち、Pandasを使った勉強をしております。勉強したことを少し載せます。
こういうCSVを作る
kattakiroku.csv
kiroku_id,date 1,20180101 2,20190208 3,20190515 4,20190623 5,20191111
sale.csv
shohin_id,name,price 1,カレールー,100 2,にんじん,210 3,じゃがいも,100 4,メンマ,580 5,牛肉,90 6,玉ねぎ,130
nanikatta.csv
kiroku_id,shohin_id 1,1 1,3 1,5 2,2 2,4 2,5 2,6 3,1 3,2 4,3 4,4 4,4 5,1 5,6
pandas.read_csvでcsvからデータを取得する
pandasを使って上記のCSVを読み込むと以下のようになります。
import pandas as pd sale = pd.read_csv('sale.csv') kattakiroku = pd.read_csv('kattakiroku.csv') nanikatta = pd.read_csv('nanikatta.csv')
import pandas as pd
について、pdとはpandasが推奨する省略形式のようです。
pd.read_csv(CSV_FILE)
とすることでCSVの中身をpandasのDataFrame
というオブジェクトとして読み込むことが出来ます。
DataFrame
は2次元データを管理するオブジェクトです。1次元データの場合はSeries
というオブジェクトで管理されます。
pandas.mergeで結合する
keyを使ってデータを結合することができます。結合の対象となるものは同じカラム名があるときの場合のようです。on
引数でkeyを設定することも出来ます。
merged_df = pd.merge(nanitabeta, sale) print(merged_df) => kiroku_id shohin_id name price 0 1 1 カレールー 100 1 3 1 カレールー 100 2 5 1 カレールー 100 3 1 3 じゃがいも 100 4 4 3 じゃがいも 100 5 1 5 牛肉 90 6 2 5 牛肉 90 7 2 2 にんじん 210 8 3 2 にんじん 210 9 2 4 メンマ 580 10 4 4 メンマ 580 11 4 4 メンマ 580 12 2 6 玉ねぎ 130 13 5 6 玉ねぎ 130
カラムに対し1レコードがもっている要素の数が多いように見受けられます。これはPandas
がもっているindex
というものになります。下記のレコードの一番左の0
がindex
です。index
は好きに設定することも出来ます。
kiroku_id shohin_id name price 0 1 1 カレールー 100
DataFrame.queryでフィルタリング
kiroku_id
が1のデータを取り出すようにフィルタリングします。pandas.query
を使うことで、直感的に操作できます。
merged_df_1 = merged_df.query('kiroku_id == 1') merged_df_1_price = merged_df_1.sum()['price'] print(merged_df_1_price) => 290 <class 'int'>
merged_df.query('kiroku_id == 1')
のようにDataFrame.query('QUERY文')
を書くとフィルタリングした結果が返されます。
print(merged_df.query('price >= 200')) => kiroku_id shohin_id name price 7 2 2 にんじん 210 8 3 2 にんじん 210 9 2 4 メンマ 580 10 4 4 メンマ 580 11 4 4 メンマ 580 print(merged_df.query('price >= 580 | price <= 100')) => kiroku_id shohin_id name price 0 1 1 カレールー 100 1 3 1 カレールー 100 2 5 1 カレールー 100 3 1 3 じゃがいも 100 4 4 3 じゃがいも 100 5 1 5 牛肉 90 6 2 5 牛肉 90 9 2 4 メンマ 580 10 4 4 メンマ 580 11 4 4 メンマ 580 print(merged_df.query('name == "牛肉"')) => kiroku_id shohin_id name price 5 1 5 牛肉 90 6 2 5 牛肉 90
もっと出来ることありそう
pandasを触っててやりやすいと思うのは直感的
に操作できることだと思いました。mergeもqueryも直感的でわかりやすいです。