PythonをコマンドラインでPandas使ってみよう
今日の学びは、Python の中でも、Jupyter Notebook を使わずにコマンドライン環境で、Pandas でごにょごにょしてみる練習をしたメモ書きです。
Pandas とは何か
Pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。 ウィキペディア
これを使わないでデータ解析できない!ってくらい強力であり当たり前のように使っているライブラリらしいです。しかも奥が深くて、追及したらすごいことになるそうで、ただ簡単に使えるので簡単なデータ集計、整形するにもすぐ使えてすごい優れものらしい。
ではWindows 前提ではあるが、cmd で黒窓(コマンドライン)を出してみよう。(事前にAnaconda で Python3 が入っているものとします)
cmd
そして、
Pandas をインストールしよう
pip install pandas
するとごにょごにょでてきます。
C:\Users\kurita > pip install pandas
Requirement already satisfied: pandas in c:\anaconda3\lib\site-packages (0.23.4)
Requirement already satisfied: python-dateutil>=2.5.0 in c:\anaconda3\lib\site-packages (from pandas) (2.7.5)
Requirement already satisfied: pytz>=2011k in c:\anaconda3\lib\site-packages (from pandas) (2018.7)
Requirement already satisfied: numpy>=1.9.0 in c:\anaconda3\lib\site-packages (from pandas) (1.15.4)
Requirement already satisfied: six>=1.5 in c:\anaconda3\lib\site-packages (from python-dateutil>=2.5.0->pandas) (1.12.0)
Anaconda 環境の配下にPandas が入ったようです。
サンプルデータを自分で作るか、どこかの github で公開されてるデータをClone して使わせてもらおう
今回は、GitHub からクローンしてみる。
必要なデータをGitHubからクローンしよう
git clone https://github.com/takahi-i/data-analysis-samples.git
GitHub からパスをコピって、みんな大好き「git clone」してデータをローカルに持ってきましょう。
では早速Python 起動しましょう。「python」と入れてエンターします
C:\Users\kurita >python
Python 3.7.1 | packaged by conda-forge | (default, Nov 13 2018, 19:01:41) [MSC v.1900 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
で起動しました。バージョンは「Python 3.7.1」のようです。
import pandas as pd
Pandas をインポートしてみよう
次に先ほど説明した Pandas をインポートしてみよう
>>> import pandas as pd
>>>
1,2秒 くらいか、一瞬間があるが何事もなく 「>>>>」がでたらインポート完了してます。
ためしに実行してみましょう
Pandas as pd としてインポートしたので、Pandas を 「pd」で読めるようになっています。
【as】ライブラリ名に好きな省略名を付与
df = pd.DataFrame([[1, 10], [2, 20], [3, 30], [4, 40]], index=['a', 'b', 'c', 'd'], columns=['col1', 'col2'])
Pandas データフレーム
Python で行列データを取り扱うときは Pandas モジュールのデータフレーム型を利用すると便利である。各行ごとの平均や列名で列を抽出したりすることが簡単に行えるようになる。
Pandas のデータフレームを使って、行列データを作成しているサンプルです。データフレームを作成して、次にデータフレームを表示までやってみます。
>>> df = pd.DataFrame([[1, 10], [2, 20], [3, 30], [4, 40]], index=['a', 'b', 'c', 'd'], columns=['col1', 'col2'])
>>> df
col1 col2
a 1 10
b 2 20
c 3 30
d 4 40
df という変数に、Pandas でデータフレームを作ったデータを格納
そしてdf という中身を出力したら、CSVみたいな行列データが表示されました。というものが上記黒窓です。
df = pd.DataFrame({'A': [1.0, 1.2, 3.4, 4.1, 8.2],
'B': [0.8, 1.4, 3.2, 4.3, 7.9],
'C': [1.3, 1.4, 2.9, 3.8, 9.4]},
index = ['d1', 'd2', 'd3', 'd4', 'd5'])
次にもう少し見やすい、インデントありのデータフレームでも練習
上記をコピーして張り付けてみよう
>>> df = pd.DataFrame({'A': [1.0, 1.2, 3.4, 4.1, 8.2],
... 'B': [0.8, 1.4, 3.2, 4.3, 7.9],
... 'C': [1.3, 1.4, 2.9, 3.8, 9.4]},
... index = ['d1', 'd2', 'd3', 'd4', 'd5'])
>>> df
A B C
d1 1.0 0.8 1.3
d2 1.2 1.4 1.4
d3 3.4 3.2 2.9
d4 4.1 4.3 3.8
d5 8.2 7.9 9.4
エンターして、「df」表示させるとこのようになりました。
コマンドラインではあるものの、複数行にまたがる張り付けしても大丈夫のようだ。
現在のパスを知る
CSVなど外部ファイルを読み込みたいとする
そうすると現在のパスからの相対パスが必要になる。
Linuxのコマンドであれば、CDでチェンジディレクトリして、現在地が知りたいときに使うPWDで現在地を知るコマンドがあるが、それがPythonではそのままではないので、OSライブラリを読み込む必要がある
osモジュールは、OSに依存しているさまざまな機能を利用できてほかにもさまざまあるようだ
今回必要なのは「os.getcwd()」を使ってみる
>>> import os
>>> path = os.getcwd()
>>> print(path)
C:\Users\kurita
つまり現在地は「C:\Users\kurita」にいることになる。
外部ファイルを読み込む場合はこの直下、もしくはここからの相対パスを指定してあげればいい。
git clone したデータであれば、マイドキュメント直下にクローンされてる場合が多いと思うので、そこにあるCSVデータを読み込んでみる
df = pd.read_csv('./data-analysis-samples/data/small_sample.csv')
問題なければ、エラーなく次の行がでるはずだ。下記のように
>>> df = pd.read_csv('./data-analysis-samples/data/small_sample.csv')
>>>
このようになったら読み込み成功です。
「DF」という箱にCSVのデータが読み込まれた状態になっている
このCSVには何が入っているかというと下記のようなCSVデータです。
name,age,state,point,date
Alice,24,NY,64,20181123T000000
Bob,42,CA,92,20141210T000000
Charlie,18,CA,70,20100110T000000
Dave,68,TX,70,20100701T000000
Ellen,24,CA,88,20081028T000000
Frank,30,NY,57,20190813T000000
Rad,20,NY,,20160113T000000
読み込んだので、先ほどデータフレームを表示したように変数名(今回はdf)を入力して表示させてみる
>>> df = pd.read_csv('./data-analysis-samples/data/small_sample.csv')
>>> df
name age state point date
0 Alice 24 NY 64.0 20181123T000000
1 Bob 42 CA 92.0 20141210T000000
2 Charlie 18 CA 70.0 20100110T000000
3 Dave 68 TX 70.0 20100701T000000
4 Ellen 24 CA 88.0 20081028T000000
5 Frank 30 NY 57.0 20190813T000000
6 Rad 20 NY NaN 20160113T000000
このように、CSVデータと同じものが表示されたら成功です!
ではこのデータを使っていくつかデータ分析に使えるコマンドを試してみよう。
Pandas のデータフレーム操作コマンドを使ってみる
df.index
>>> df.index
RangeIndex(start=0, stop=7, step=1)
df.index.values
>>> df.index.values
array([0, 1, 2, 3, 4, 5, 6], dtype=int64)
df.columns
>>> df.columns
Index(['name', 'age', 'state', 'point', 'date'], dtype='object')
df.columns.values
>>> df.columns.values
array(['name', 'age', 'state', 'point', 'date'], dtype=object)
df.describe
>>> df.describe
<bound method NDFrame.describe of name age state point date
0 Alice 24 NY 64.0 20181123T000000
1 Bob 42 CA 92.0 20141210T000000
2 Charlie 18 CA 70.0 20100110T000000
3 Dave 68 TX 70.0 20100701T000000
4 Ellen 24 CA 88.0 20081028T000000
5 Frank 30 NY 57.0 20190813T000000
6 Rad 20 NY NaN 20160113T000000>
df.head(3)
>>> df.head(3)
name age state point date
0 Alice 24 NY 64.0 20181123T000000
1 Bob 42 CA 92.0 20141210T000000
2 Charlie 18 CA 70.0 20100110T000000
というように、今回は数行のデータフレームでしたが、数万、数百万のデータになればなるほど、Pandas の本領発揮できるようです。
データを加工してみよう
次に元のデータを何かに使うために、主に機械学習(ディープラーニングなどの整形用に)データを加工してみる
先ほど読み込んだCSVデータの「data」カラム(列)の頭の4文字が年号を表していることに着目して、先頭4文字を取り出して別のカラムに格納することをしてみる。
>>> def date_str2year(input):
まで入れてエンターして、tabキー(インデント)して次の行を入力
>>> def date_str2year(input):
... return int(input[:4])
「... 」はまだプログラム自体は終了していないことを示しています
そしてエンターしてこの一連のプログラムを終了(完結)します
>>> def date_str2year(input):
... return int(input[:4])
...
>>>
ここまで来たら、最初の2行が完結して、次のステップのコマンドを入力
>>> def date_str2year(input):
... return int(input[:4])
...
>>> df['year'] =df['date'].apply(date_str2year)
で、2つめの処理が終わりましたので、格納された「df」を表示させると
>>> def date_str2year(input):
... return int(input[:4])
...
>>> df['year'] =df['date'].apply(date_str2year)
>>> df
name age state point date year
0 Alice 24 NY 64.0 20181123T000000 2018
1 Bob 42 CA 92.0 20141210T000000 2014
2 Charlie 18 CA 70.0 20100110T000000 2010
3 Dave 68 TX 70.0 20100701T000000 2010
4 Ellen 24 CA 88.0 20081028T000000 2008
5 Frank 30 NY 57.0 20190813T000000 2019
6 Rad 20 NY NaN 20160113T000000 2016
最後のカラムに「year」が作成され、「date」の4文字目までが格納されていることが分かります。
このようにPandas を使うと、簡単にデータの再加工、整形が簡単にできてしまう便利なものだということが理解できました。
Pandas の良くまとまってるQiita 見つけました。↓
Webのお仕事、元phpプログラマ、今主にWebディレクタ、たまにエンジニア、UXディレクタ、LTのネタ探ししてます。