PandasパッケージをインストールしてPython3でデータ構造を操作する方法
序章
Python pandas
パッケージは、データの操作と分析に使用され、ラベル付きデータまたはリレーショナルデータをより直感的な方法で操作できるように設計されています。
numpy
パッケージに基づいて構築されたpandas
には、ラベル、記述インデックスが含まれており、一般的なデータ形式や欠落データの処理に特に堅牢です。
pandas
パッケージはスプレッドシート機能を提供しますが、データの操作はスプレッドシートよりもPythonの方がはるかに高速であり、pandas
は非常に効率的であることが証明されています。
このチュートリアルでは、最初にpandas
をインストールしてから、基本的なデータ構造であるSeriesとDataFramesについて説明します。
pandas
をインストールしています
他のPythonパッケージと同様に、pandas
をpip
と一緒にインストールできます。
まず、選択したローカルプログラミング環境またはサーバーベースのプログラミング環境に移動し、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_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
データ、または何らかの理由で存在しないデータを参照する欠落データを処理するためのさまざまな方法を提供します。 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データ構造を操作できるようになります。