Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】pandasを使ってみる

こんばんは、葛の葉です。

ここ最近はPyQというサービスを使ってPythonの勉強をしています。環境構築とかがなくても、Webブラウザ上ですぐに学べるのがいいところだと思います。月3000円とネットフリックスと言った娯楽サービスの月額料金と比べるとお高い感じがしますが、参考書1冊分だと思えば安い方だと思います。私はどちらかというと手を動かして覚えたい方ですので、こういったコードを書きながら学べるサービスは非常に良いと思いました。

pyq.jp

さて、私は現在、データ分析のコースをプレイしております。そのうち、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_csvcsvからデータを取得する

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.pydata.org

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というものになります。下記のレコードの一番左の0indexです。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も直感的でわかりやすいです。