見出し画像

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のネタ探ししてます。