前書き
Pythonpandas
パッケージは、データの操作と分析に使用され、ラベル付きデータまたはリレーショナルデータをより直感的な方法で操作できるように設計されています。
numpy
パッケージに基づいて構築されたpandas
には、ラベル、記述インデックスが含まれており、一般的なデータ形式や欠落データの処理に特に堅牢です。
pandas
パッケージはスプレッドシート機能を提供しますが、データの操作はスプレッドシートよりもPythonの方がはるかに高速であり、pandas
は非常に効率的であることが証明されています。
このチュートリアルでは、最初にpandas
をインストールしてから、基本的なデータ構造であるSeriesとDataFramesについて説明します。
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()
関数は数値データ型について次の情報を提供します。
戻る | その意味 |
---|---|
|
頻度カウント;何かが発生した回数 |
|
平均または平均 |
|
標準偏差、データがどの程度変化するかを示すために使用される数値 |
|
セット内の最小数または最小数 |
|
25パーセンタイル |
|
50パーセンタイル |
|
75パーセンタイル |
|
セット内の最大数または最大数 |
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データ構造を操作できるようになります。