PandasパッケージをインストールしてPython3でデータ構造を操作する方法

提供:Dev Guides
移動先:案内検索

序章

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

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

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

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

pandasをインストールしています

他のPythonパッケージと同様に、pandaspipと一緒にインストールできます。

まず、選択したローカルプログラミング環境またはサーバーベースのプログラミング環境に移動し、pandasとその依存関係をインストールします。

pip install pandas numpy python-dateutil pytz

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

OutputSuccessfully installed pandas-0.19.2

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

conda install pandas

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

シリーズ

pandasでは、 Series は、任意のデータ型を保持できる1次元配列です。 軸ラベルはまとめてインデックスと呼ばれます。

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

python

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

import numpy as np
import pandas as pd

Seriesを使用する前に、一般的にどのように見えるかを見てみましょう。

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

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

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

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=...)関数を使用して、DataFrame内のデータをソートできます。

たとえば、ascendingブールパラメータを使用してみましょう。これはTrueまたはFalseのいずれかになります。 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から収集できるいくつかの要約統計量を見てみましょう。

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

戻る その意味
count 頻度カウント; 何かが発生する回数
mean 平均または平均
std 標準偏差、データがどの程度変化するかを示すために使用される数値
min セット内の最小数または最小数
25% 25パーセンタイル
50% 50パーセンタイル
75% 75パーセンタイル
max セット内の最大数または最大数

describe()関数を使用してocean_depthsDataFrameを呼び出して、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データ、または何らかの理由で存在しないデータを参照する欠落データを処理するためのさまざまな方法を提供します。 pandasでは、これはNAデータと呼ばれ、NaNとしてレンダリングされます。

欠落値の削除DataFrame.dropna()関数で、欠落値の入力DataFrame.fillna()関数で説明します。 これにより、開始時に問題が発生することがなくなります。

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)

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

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がこれらのスペースに入力されます。 必要に応じてフロートが使用されていることに気付くでしょう。

この時点で、データの並べ替え、統計分析、およびDataFrameで欠落している値の処理を行うことができます。

結論

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