pandasパッケージをインストールし、Python 3でデータ構造を操作する方法

前書き

Pythonpandasパッケージは、データの操作と分析に使用され、ラベル付きデータまたはリレーショナルデータをより直感的な方法で操作できるように設計されています。

numpyパッケージに基づいて構築されたpandasには、ラベル、記述インデックスが含まれており、一般的なデータ形式や欠落データの処理に特に堅牢です。

pandasパッケージはスプレッドシート機能を提供しますが、データの操作はスプレッドシートよりもPythonの方がはるかに高速であり、pandasは非常に効率的であることが証明されています。

このチュートリアルでは、最初にpandasをインストールしてから、基本的なデータ構造であるSeriesDataFramesについて説明します。

pandasのインストール

他のPythonパッケージと同様に、pipとともにpandasをインストールできます。

まず、選択したlocal programming environmentまたはserver-based programming environmentに移動し、そこに依存関係とともにpandasをインストールします。

pip install pandas numpy python-dateutil pytz

次のような出力が表示されます。

OutputSuccessfully installed pandas-0.19.2

Anaconda内にpandasをインストールする場合は、次のコマンドを使用してインストールできます。

conda install pandas

この時点で、pandasパッケージの操作を開始する準備が整いました。

シリーズ

pandasでは、Seriesは任意のdata typeを保持できる1次元配列です。 軸ラベルはまとめてindexと呼ばれます。

コマンドラインでPythonインタープリターを次のように起動します。

python

インタープリター内から、numpyパッケージとpandasパッケージの両方を名前空間にインポートします。

import numpy as np
import pandas as pd

シリーズを使用する前に、一般的な外観を見てみましょう。

s = pd.Series([data], index=[index])

データがPythonlistのように構造化されていることに気付くかもしれません。

インデックスを宣言せずに

整数データを入力してから、シリーズの名前パラメーターを指定しますが、indexパラメーターを使用して、pandasが暗黙的にデータを設定する方法を確認することは避けます。

s = pd.Series([0, 1, 4, 9, 16, 25], name='Squares')

それでは、シリーズを呼び出して、pandasがシリーズで何をするかを確認しましょう。

s

次の出力が表示されます。左側の列にインデックスがあり、右側の列にデータ値があります。 列の下には、シリーズの名前と値を構成するデータ型に関する情報があります。

Output0     0
1     1
2     4
3     9
4    16
5    25
Name: Squares, dtype: int64

配列のインデックスは提供していませんが、0から5までの整数値が暗黙的に追加されています。

インデックスの宣言

上記の構文が示すように、明示的なインデックスを使用してSeriesを作成することもできます。 地球の海洋のメートル単位の平均深度に関するデータを使用します。

avg_ocean_depth = pd.Series([1205, 3646, 3741, 4080, 3270], index=['Arctic',  'Atlantic', 'Indian', 'Pacific', 'Southern'])

シリーズが構築されたら、それを呼び出して出力を確認しましょう。

avg_ocean_depth
OutputArctic      1205
Atlantic    3646
Indian      3741
Pacific     4080
Southern    3270
dtype: int64

指定したインデックスが左側にあり、右側に値があることがわかります。

シリーズのインデックス作成とスライス

pandasシリーズを使用すると、対応する番号でインデックスを作成して値を取得できます。

avg_ocean_depth[2]
Output3741

インデックス番号でスライスして値を取得することもできます。

avg_ocean_depth[2:4]
OutputIndian     3741
Pacific    4080
dtype: int64

さらに、インデックスの値を呼び出して、対応する値を返すことができます。

avg_ocean_depth['Indian']
Output3741

インデックスの値でスライスして、対応する値を返すこともできます。

avg_ocean_depth['Indian':'Southern']
OutputIndian      3741
Pacific     4080
Southern    3270
dtype: int64

この最後の例では、インデックス名でスライスするときに、2つのパラメーターが排他的ではなく包括的であることに注意してください。

quit()でPythonインタープリターを終了しましょう。

辞書で初期化されたシリーズ

pandasを使用すると、dictionaryデータ型を使用してシリーズを初期化することもできます。 この方法では、インデックスを個別のリストとして宣言するのではなく、組み込みキーをインデックスとして使用します。

ocean.pyというファイルを作成し、それを印刷するための呼び出しを使用して次の辞書を追加しましょう。

ocean.py

import numpy as np
import pandas as pd

avg_ocean_depth = pd.Series({
                    'Arctic': 1205,
                    'Atlantic': 3646,
                    'Indian': 3741,
                    'Pacific': 4080,
                    'Southern': 3270
})

print(avg_ocean_depth)

これで、コマンドラインでファイルを実行できます。

python ocean.py

次の出力が表示されます。

OutputArctic      1205
Atlantic    3646
Indian      3741
Pacific     4080
Southern    3270
dtype: int64

シリーズは整理された方法で表示され、左側にインデックス(キーで構成)、右側に値のセットが表示されます。

これは、キーを呼び出すことで値にアクセスできるという点で、他のPython辞書と同じように動作します。

ocean_depth.py

...
print(avg_ocean_depth['Indian'])
print(avg_ocean_depth['Atlantic':'Indian'])
Output3741
Atlantic    3646
Indian      3741
dtype: int64

ただし、これらのシリーズは現在Pythonオブジェクトであるため、辞書関数を使用することはできません。

Python辞書は、pandasでシリーズを設定するための別の形式を提供します。

データフレーム

DataFramesは、異なるデータ型で構成されている可能性のある列を持つ2次元のラベル付きデータ構造です。

DataFramesは、スプレッドシートまたはSQLテーブルに似ています。 一般に、pandasを使用する場合、DataFrameが最も一般的に使用されるオブジェクトになります。

pandas DataFrameがどのように機能するかを理解するために、2つのシリーズを設定し、それらをDataFrameに渡します。 最初のシリーズは以前のavg_ocean_depthシリーズで、2番目のシリーズはmax_ocean_depthで、地球上の各海の最大深度のデータがメートル単位で含まれています。

ocean.py

import numpy as np
import pandas as pd


avg_ocean_depth = pd.Series({
                    'Arctic': 1205,
                    'Atlantic': 3646,
                    'Indian': 3741,
                    'Pacific': 4080,
                    'Southern': 3270
})

max_ocean_depth = pd.Series({
                    'Arctic': 5567,
                    'Atlantic': 8486,
                    'Indian': 7906,
                    'Pacific': 10803,
                    'Southern': 7075
})

これらの2つのシリーズを設定したら、ファイルの下部、max_ocean_depthシリーズの下にDataFrameを追加しましょう。 この例では、これらのシリーズの両方に同じインデックスラベルがありますが、異なるラベルのシリーズがある場合、欠落している値にはNaNのラベルが付けられます。

これは、シリーズの変数のキーとして宣言する列ラベルを含めることができるように構築されています。 DataFrameの外観を確認するには、呼び出しを発行して印刷します。

ocean.py

...
max_ocean_depth = pd.Series({
                    'Arctic': 5567,
                    'Atlantic': 8486,
                    'Indian': 7906,
                    'Pacific': 10803,
                    'Southern': 7075
})

ocean_depths = pd.DataFrame({
                    'Avg. Depth (m)': avg_ocean_depth,
                    'Max. Depth (m)': max_ocean_depth
})

print(ocean_depths)
Output          Avg. Depth (m)  Max. Depth (m)
Arctic              1205            5567
Atlantic            3646            8486
Indian              3741            7906
Pacific             4080           10803
Southern            3270            7075

出力には、2つの列見出しとそれぞれの下にある数値データが表示され、辞書キーのラベルは左側にあります。

DataFramesでのデータの並べ替え

DataFrame.sort_values(by=...)関数を使用してsort the data in the DataFrameを実行できます。

たとえば、TrueまたはFalseのいずれかであるascendingブールパラメータを使用してみましょう。 ascendingは関数に渡すことができるパラメーターですが、降順はそうではないことに注意してください。

ocean_depth.py

...
print(ocean_depths.sort_values('Avg. Depth (m)', ascending=True))
Output          Avg. Depth (m)  Max. Depth (m)
Arctic              1205            5567
Southern            3270            7075
Atlantic            3646            8486
Indian              3741            7906
Pacific             4080           10803

これで、出力の左端の整数列に、低い値から高い値への昇順の数値が表示されます。

DataFramesを使用した統計分析

次に、DataFrame.describe()関数を使用してpandasから収集できるsome summary statisticsを見てみましょう。

特定のパラメーターを渡さずに、DataFrame.describe()関数は数値データ型について次の情報を提供します。

戻る その意味

count

頻度カウント;何かが発生した回数

mean

平均または平均

std

標準偏差、データがどの程度変化するかを示すために使用される数値

min

セット内の最小数または最小数

25%

25パーセンタイル

50%

50パーセンタイル

75%

75パーセンタイル

max

セット内の最大数または最大数

describe()関数を使用してocean_depths DataFrameを呼び出して、Pythonにこの統計データを出力させましょう。

ocean.py

...
print(ocean_depths.describe())

このプログラムを実行すると、次の出力が表示されます。

Output       Avg. Depth (m)  Max. Depth (m)
count        5.000000        5.000000
mean      3188.400000     7967.400000
std       1145.671113     1928.188347
min       1205.000000     5567.000000
25%       3270.000000     7075.000000
50%       3646.000000     7906.000000
75%       3741.000000     8486.000000
max       4080.000000    10803.000000

ここでの出力を元のDataFrameと比較し、グループとして考えた場合に地球の海洋の平均深度と最大深度をより正確に把握できるようになりました。

欠損値の処理

多くの場合、データを操作するとき、値が欠落しています。 pandasパッケージは、nullデータ、または何らかの理由で存在しないデータを参照するworking with missing dataに対してさまざまな方法を提供します。 pandasでは、これはNAデータと呼ばれ、NaNとしてレンダリングされます。

DataFrame.dropna()関数を使用してdropping missing valuesを確認し、DataFrame.fillna()関数を使用してfilling missing valuesを確認します。 これにより、開始時に問題が発生しないことが保証されます。

user_data.pyという名前の新しいファイルを作成し、値が欠落しているデータをそのファイルに入力して、DataFrameに変換してみましょう。

user_data.py

import numpy as np
import pandas as pd


user_data = {'first_name': ['Sammy', 'Jesse', np.nan, 'Jamie'],
        'last_name': ['Shark', 'Octopus', np.nan, 'Mantis shrimp'],
        'online': [True, np.nan, False, True],
        'followers': [987, 432, 321, np.nan]}

df = pd.DataFrame(user_data, columns = ['first_name', 'last_name', 'online', 'followers'])

print(df)

印刷を呼び出すと、プログラムを実行したときに次の出力が表示されます。

Output  first_name      last_name online  followers
0      Sammy          Shark   True      987.0
1      Jesse        Octopus    NaN      432.0
2        NaN            NaN  False      321.0
3      Jamie  Mantis shrimp   True        NaN

ここにはかなりの数の欠損値があります。

まず、dropna()で欠落している値を削除しましょう。

user_data.py

...
df_drop_missing = df.dropna()

print(df_drop_missing)

小さなデータセットには値が欠落していない行が1つしかないため、プログラムを実行したときにそのまま残る行はそれだけです。

Output  first_name last_name online  followers
0      Sammy     Shark   True      987.0

値を削除する代わりに、不足している値に0などの選択した値を入力することもできます。 これはDataFrame.fillna(0)で達成します。

ファイルに追加した最後の2行を削除またはコメントアウトし、次を追加します。

user_data.py

...
df_fill = df.fillna(0)

print(df_fill)

プログラムを実行すると、次の出力が表示されます。

Output  first_name      last_name online  followers
0      Sammy          Shark   True      987.0
1      Jesse        Octopus      0      432.0
2          0              0  False      321.0
3      Jamie  Mantis shrimp   True        0.0

これで、すべての列と行がそのままになり、値としてNaNを使用する代わりに、これらのスペースに0を入力するようになりました。 必要に応じてフロートが使用されることに気付くでしょう。

この時点で、データを並べ替え、統計分析を行い、DataFramesの欠損値を処理できます。

結論

このチュートリアルでは、pandasとPython3を使用したデータ分析の紹介情報について説明しました。 これでpandasがインストールされ、pandas内でSeriesおよびDataFramesデータ構造を操作できるようになります。

Related