pipでpandasを導入!簡単なインストール手順と基本の使い方を徹底解説
データ分析、機械学習、統計処理など、Pythonを使ってデータサイエンスに取り組む上で、避けて通れない強力なライブラリが「pandas」です。表形式データの操作や解析を驚くほど簡単かつ効率的に行うことができます。Excelやデータベースのようなデータを、Pythonのコードで自由自在に操るための必須ツールと言えるでしょう。
「pandasを使ってみたいけど、どうやってインストールするの?」「インストールはできたけど、最初の使い方がわからない…」
この記事は、そんな疑問を持つあなたのためのものです。Pythonのパッケージ管理ツールであるpipを使ってpandasを導入する最も標準的で簡単な手順から、SeriesやDataFrameといったpandasの根幹をなすデータ構造の基本的な使い方まで、コード例を豊富に交えながら徹底的に解説します。
この記事を読み終える頃には、あなたは自信を持ってpandasを使い始め、あなたのデータ分析の旅を大きく前進させることができるはずです。さあ、一緒にpandasの世界へ飛び込みましょう!
記事で学べること
- pandasとは何か、なぜデータ分析に重要なのか
- pandasのインストールに必要な前提知識(Python, pip)
- pipを使ったpandasの基本的なインストール手順
- インストールがうまくいかない場合のトラブルシューティング
- pandasの基本的なデータ構造であるSeriesの作成と操作
- pandasの主要なデータ構造であるDataFrameの作成と基本的な操作(データの表示、選択、追加、削除)
- CSVファイルなどの外部データを取り扱う方法
- DataFrameを使った基本的なデータ操作(欠損値処理、並べ替え、集計の初歩)
1. pandasとは?なぜデータ分析に必要不可欠なのか
pandasは、Pythonプログラミング言語用のオープンソースのデータ操作および分析ライブラリです。特に、数値表および時系列データを操作するための高速で柔軟かつ表現力豊かなデータ構造を提供することに特化しています。
pandasの主な特徴:
- 高速なデータ処理: pandasは内部的に高度に最適化されており、大規模なデータセットでも高速に処理を行うことができます。これは、数値計算ライブラリNumPyを基盤としているためです。
- 柔軟なデータ構造: Series(1次元)とDataFrame(2次元)という2つの主要なデータ構造を提供し、様々な形式のデータを柔軟に扱うことができます。
- 豊富な機能: データの読み込み、書き込み、クリーニング、変換、集計、結合、可視化(matplotlibとの連携)など、データ分析に必要なあらゆる機能が詰まっています。
- 欠損データの扱い: 欠損値を
NaN
(Not a Number)として扱い、欠損値を含むデータの処理を容易に行うための機能が充実しています。 - ラベルによるインデックス: 行や列を数値だけでなく、任意のラベル(文字列など)で指定できるため、データの意味を損なわずに直感的な操作が可能です。
なぜデータ分析に必要不可欠なのか?
データ分析のプロセスは、大きく分けて以下のステップから構成されます。
- データ収集: 必要なデータを集める。
- データクリーニング(前処理): 収集したデータの誤りや欠損を修正し、分析可能な形に整える。
- データ探索(探索的データ分析: EDA): データの統計的概要を確認したり、可視化したりして、データの特性や傾向を把握する。
- モデリング/分析: 統計モデルの構築や機械学習アルゴリズムの適用などを行う。
- 結果の評価と解釈: 分析結果が妥当か評価し、その意味を解釈する。
- レポート/伝達: 分析結果を他者に分かりやすく伝える。
pandasは、特に2.データクリーニング、3.データ探索、そして4.モデリングに向けたデータ準備のステップにおいて、絶大な威力を発揮します。Excelで手作業で行っていたようなデータの並べ替え、フィルタリング、集計、結合といった操作を、コードで自動化・再現可能な形で行えるようになります。
例えば、CSVファイルに保存された顧客データがあるとします。pandasを使えば、数行のコードで以下のような作業が可能です。
- ファイルからデータを読み込む。
- 顧客の年齢や購買金額の平均、最大、最小を計算する。
- 特定の地域に住む顧客だけを抽出する。
- 欠損している情報を補完したり、不整合なデータを修正したりする。
- 別のファイルにある購買履歴データと顧客データを紐づける。
これらの作業を効率的に行えるpandasは、現代のデータサイエンスにおいてまさに「デファクトスタンダード」とも言えるライブラリです。
2. インストールに必要な前提知識
pandasをインストールする前に、いくつか確認しておきたい前提知識があります。
- Pythonのインストール: pandasはPythonライブラリですので、当然ながらPythonがあなたのコンピューターにインストールされている必要があります。もしインストールしていない場合は、Pythonの公式サイトから最新版(通常は3.x系)をダウンロードしてインストールしてください。インストールの際には、「Add Python to PATH」(Pythonを環境変数PATHに追加する)というオプションにチェックを入れることを強く推奨します。これにチェックを入れておくと、コマンドプロンプトやターミナルからPythonのコマンドを実行できるようになり、pipも利用しやすくなります。
- pipについて: pip(Package Installer for Python)は、Pythonで書かれたソフトウェアパッケージをインストール・管理するための標準的なパッケージ管理システムです。Pythonのバージョン3.4以降には標準で含まれています。pandasのような外部ライブラリは、このpipを使ってインストールするのが最も一般的です。
pipが利用可能か確認する
コマンドプロンプト(Windows)またはターミナル(macOS/Linux)を開き、以下のコマンドを実行してみてください。
bash
pip --version
または
bash
pip3 --version
もしPython 3.xをインストールしていて、PATHが正しく設定されていれば、インストールされているpipのバージョン情報が表示されるはずです。
pip 21.2.4 from C:\Python39\lib\site-packages\pip (python 3.9)
このようにバージョン情報が表示されれば、pipは正しくインストールされており、利用できる状態です。もし「’pip’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のようなエラーメッセージが表示された場合は、Pythonのインストール時にPATHに追加する設定を見落とした可能性があります。その場合は、Pythonをアンインストールして再インストールするか、手動で環境変数PATHを設定する必要があります。
仮想環境の推奨
pandasのようなライブラリは、プロジェクトごとに異なるバージョンが必要になったり、他のライブラリとの依存関係で問題が発生したりすることがあります。これを避けるために、Pythonでは「仮想環境」を作成して作業することが強く推奨されています。
仮想環境とは、特定のプロジェクト専用のPython実行環境を作成するものです。仮想環境内にインストールされたライブラリは、その仮想環境内でのみ有効であり、システム全体のPython環境や他の仮想環境に影響を与えません。これにより、プロジェクトごとに必要なライブラリのバージョンを隔離し、依存関係の衝突を防ぐことができます。
Python 3.3以降には、標準ライブラリとしてvenv
という仮想環境を作成するためのツールが付属しています。また、データサイエンスの分野ではconda
というツールもよく利用されます(AnacondaやMinicondaをインストールすると利用可能になります)。
この記事では、pandasのインストール手順自体は仮想環境内外で共通しているため、基本的なコマンドを説明します。しかし、実務や少し複雑なプロジェクトでpandasを利用する場合は、仮想環境を作成してからpandasをインストールすることを強く推奨します。
venvを使った仮想環境の基本的な作成と有効化(参考)
- 仮想環境の作成: 作業したいプロジェクトのディレクトリに移動し、以下のコマンドを実行します。
myenv
の部分は任意の仮想環境名です。
bash
python -m venv myenv
または
bash
python3 -m venv myenv - 仮想環境の有効化:
- Windows:
bash
myenv\Scripts\activate - macOS/Linux:
bash
source myenv/bin/activate
仮想環境が有効化されると、コマンドプロンプト/ターミナルのプロンプトの先頭に仮想環境名(例:(myenv)
)が表示されるようになります。この状態でpipコマンドを実行すると、作成した仮想環境内にライブラリがインストールされます。仮想環境を終了するには、deactivate
コマンドを実行します。
- Windows:
3. pipを使ったpandasのインストール手順
それでは、pipを使ってpandasをインストールする具体的な手順を見ていきましょう。最も基本的なコマンドは非常にシンプルです。
-
コマンドプロンプトまたはターミナルを開く:
- Windows: スタートメニューから「cmd」と入力して「コマンドプロンプト」を開くか、「PowerShell」を開きます。
- macOS: Launchpadから「ターミナル」を開くか、Spotlight検索(Cmd + Space)で「ターミナル」と入力して開きます。
- Linux: アプリケーションメニューから「ターミナル」を開きます(ディストリビューションによって名称が異なる場合があります)。
-
インストールコマンドの実行:
以下のコマンドを実行します。bash
pip install pandasまたは、Python 3を明示的に指定したい場合は(システムにPython 2と3が共存している場合など)、
pip3
を使うこともできます。bash
pip3 install pandasこのコマンドを実行すると、pipはPyPI(Python Package Index)というPythonのソフトウェアリポジトリからpandasパッケージをダウンロードし、あなたのPython環境にインストールします。pandasは内部でNumPyを利用しているため、NumPyがまだインストールされていなければ、同時にNumPyも自動的にインストールされます(pipが依存関係を解決してくれます)。
-
インストールの進行:
コマンドを実行すると、以下のような出力が表示され、ダウンロードとインストールが進行します。Collecting pandas
Downloading pandas-1.3.4-cp39-cp39-win_amd64.whl (10.8 MB)
Collecting numpy>=1.21.0
Downloading numpy-1.21.4-cp39-cp39-win_amd64.whl (14.0 MB)
Collecting pytz>=2017.3
Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
Collecting python-dateutil>=2.7.3
Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting six>=1.5
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, python-dateutil, pytz, numpy, pandas
Successfully installed numpy-1.21.4 pandas-1.3.4 python-dateutil-2.8.2 pytz-2021.3 six-1.16.0
(表示されるバージョンやファイル名は、実行時の最新版やあなたの環境によって異なります。)Successfully installed ...
というメッセージが表示されれば、pandasおよびその依存ライブラリ(NumPy, pytz, python-dateutil, six)のインストールは成功です。
特定のバージョンを指定してインストールする場合
もし、特定のバージョンのpandasをインストールしたい場合は、パッケージ名の後に==
とバージョン番号を指定します。
bash
pip install pandas==1.3.4
これにより、指定した正確なバージョンのpandasがインストールされます。
インストールされているか確認する方法
インストールが完了したことを確認する方法はいくつかあります。
方法1:pip list コマンドを使う
以下のコマンドを実行すると、現在の環境にインストールされているPythonパッケージのリストが表示されます。
bash
pip list
または
bash
pip3 list
出力されたリストの中にpandas
と表示されていれば、インストールは成功しています。
“`
Package Version
numpy 1.21.4
pandas 1.3.4 <- これがあればOK
pip 21.2.4
python-dateutil 2.8.2
pytz 2021.3
six 1.16.0
setuptools 58.1.0
“`
方法2:Pythonの対話モードでインポートしてみる
コマンドプロンプト/ターミナルでPythonの対話モードを起動します。
bash
python
または
bash
python3
プロンプトが>>>
に変わったら、以下のコードを入力してEnterキーを押します。
python
import pandas as pd
このコマンドを実行しても何もエラーが表示されなければ、pandasは正常にインポートされており、使用可能な状態です。もしModuleNotFoundError: No module named 'pandas'
のようなエラーが表示された場合は、インストールがうまくいっていないか、インポートしようとしているPython環境がpandasをインストールした環境と異なっている可能性があります。
対話モードを終了するには、exit()
と入力してEnterキーを押します。
python
exit()
4. インストール時のトラブルシューティング
インストール中にエラーが発生したり、インストール後にpandasがインポートできなかったりする場合、いくつかの原因が考えられます。
- pipが認識されない:
- 原因: Pythonのインストール時にPATHに追加する設定を忘れたか、PATHの設定が間違っている。
- 対策: Pythonを再インストールする際にPATHへの追加オプションにチェックを入れるのが最も簡単です。手動でPATHを設定することも可能ですが、少し手間がかかります。または、Pythonのインストールディレクトリにある
Scripts
フォルダ(Windows)またはbin
フォルダ(macOS/Linux)内のpip
(またはpip3
)を実行するフルパスを指定することもできますが、これは一時的な回避策です。
- 権限エラー (PermissionError):
- 原因: システムディレクトリなど、書き込み権限が必要な場所にインストールしようとしている。特にmacOSやLinuxでシステム全体のPython環境にインストールしようとすると発生しやすいです。
- 対策: 仮想環境を使用することを強く推奨します。 仮想環境内でインストールすれば、ユーザー権限で書き込み可能な場所にインストールされるため、この問題を回避できます。もしシステム環境にどうしてもインストールしたい場合は、管理者権限(Windows)または
sudo
コマンド(macOS/Linux)を使ってインストールコマンドを実行する必要がある場合がありますが、これは非推奨です。
bash
# Linux/macOSの場合 (非推奨)
sudo pip install pandas
- ネットワークエラー:
- 原因: インターネットに接続されていない、またはファイアウォールやプロキシによってアクセスがブロックされている。
- 対策: インターネット接続を確認し、必要に応じてファイアウォールの設定を見直したり、プロキシ経由でpipを使用するための設定を行ったりしてください。
- コンパイラ関連のエラー (Microsoft Visual C++ 14.0 or greater is required. など):
- 原因: 一部のライブラリ(NumPyなど)は、インストール時にC/C++コンパイラが必要な場合があります。特にWindowsで発生しやすいです。
- 対策: エラーメッセージに従い、必要なコンパイラ(例: Microsoft Visual C++ Build Tools)をインストールしてください。これは、Microsoftの公式サイトからVisual Studioの無償版をダウンロードし、インストール時に「C++ Build Tools」を選択することで入手できます。最近のバージョンのpandasやNumPyは、多くの場合コンパイラ不要のホイールファイル形式で配布されているため、このエラーに遭遇する機会は減っていますが、古いバージョンや特定の環境では必要になることがあります。
ModuleNotFoundError: No module named 'pandas'
:- 原因:
- pandasが正しくインストールされていない。
- 複数のPython環境があり、pandasをインストールした環境とは別の環境でPythonを実行している。
- 仮想環境を作成したが、それを有効化せずにPythonを実行している。
- 対策:
- 再度
pip install pandas
を実行し、成功メッセージを確認する。 pip list
コマンドでpandasがリストに含まれているか確認する。- Pythonを実行する際に、意図したPythonの実行ファイル(例: 仮想環境内の
python
コマンド)を使用しているか確認する。Jupyter NotebookやIDE(VS Code, PyCharmなど)を使用している場合は、使用するPythonインタープリターの設定が正しいか確認してください。
- 再度
- 原因:
これらのトラブルシューティングを試しても解決しない場合は、エラーメッセージ全体をコピーして、PythonのバージョンやOSの情報とともにインターネット検索すると、解決策が見つかる可能性が高いです。Stack Overflowなどの開発者向けQ&Aサイトには、同様の事例に対する回答が多数存在します。
5. pandasの基本的な使い方 – Series入門
pandasのインストールが成功したら、いよいよ使い方を学んでいきましょう。pandasには主に2つの主要なデータ構造があります。一つ目は「Series」です。
Seriesとは?
Seriesは、一次元のラベル付き配列です。言い換えると、単一の列や行のデータを持つデータ構造です。各要素には、自動的にまたは明示的に指定されたインデックス(ラベル)が関連付けられます。NumPyの一次元配列(ndarray)に似ていますが、インデックスを持つ点が異なります。
基本的なSeriesの作成
最も簡単な方法は、PythonのリストやNumPyの配列から作成することです。
“`python
import pandas as pd
import numpy as np
1. リストからSeriesを作成
data_list = [10, 20, 30, 40, 50]
s1 = pd.Series(data_list)
print(“リストから作成したSeries:”)
print(s1)
print(“-” * 20)
2. NumPy配列からSeriesを作成
data_numpy = np.array([100, 200, 300, 400, 500])
s2 = pd.Series(data_numpy)
print(“NumPy配列から作成したSeries:”)
print(s2)
print(“-” * 20)
“`
実行結果:
“`
リストから作成したSeries:
0 10
1 20
2 30
3 40
4 50
dtype: int64
NumPy配列から作成したSeries:
0 100
1 200
2 300
3 400
4 500
dtype: int64
“`
出力を見ると、左側に0から始まる数字が表示されています。これがインデックスです。右側が値です。リストやNumPy配列から作成した場合、デフォルトでは0から始まる整数インデックスが自動的に割り振られます。dtype
はそのデータの型を示しています。
インデックスを指定してSeriesを作成
Seriesを作成する際に、独自のインデックスを指定することができます。これは、データの意味を表す文字列などをインデックスとして使用する場合に便利です。
“`python
インデックスを指定してSeriesを作成
data_with_index = [10, 20, 30, 40, 50]
my_index = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
s3 = pd.Series(data_with_index, index=my_index)
print(“インデックスを指定して作成したSeries:”)
print(s3)
print(“-” * 20)
“`
実行結果:
“`
インデックスを指定して作成したSeries:
a 10
b 20
c 30
d 40
e 50
dtype: int64
“`
今度は、指定した文字列がインデックスとして使われているのがわかります。
辞書からSeriesを作成
Pythonの辞書からもSeriesを作成できます。この場合、辞書のキーがSeriesのインデックスに、辞書の値がSeriesの値になります。
“`python
辞書からSeriesを作成
data_dict = {‘apple’: 150, ‘banana’: 80, ‘orange’: 120, ‘grape’: 300}
s4 = pd.Series(data_dict)
print(“辞書から作成したSeries:”)
print(s4)
print(“-” * 20)
“`
実行結果:
“`
辞書から作成したSeries:
apple 150
banana 80
orange 120
grape 300
dtype: int64
“`
辞書のキーがそのままインデックスになっていますね。これは非常に直感的で便利です。
Seriesの属性
Seriesオブジェクトはいくつかの便利な属性を持っています。
“`python
print(“s3のインデックス:”, s3.index)
print(“s3の値:”, s3.values)
print(“s3のデータ型:”, s3.dtype)
print(“s3の名前 (未指定):”, s3.name) # デフォルトはNone
Seriesに名前を付ける
s3.name = “My Sample Series”
print(“s3の名前 (指定後):”, s3.name)
“`
実行結果:
s3のインデックス: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
s3の値: [10 20 30 40 50]
s3のデータ型: int64
s3の名前 (未指定): None
s3の名前 (指定後): My Sample Series
.index
はIndexオブジェクト、.values
はNumPyのndarrayを返します。.dtype
はデータの型を示します。.name
はSeriesに名前を付けて識別しやすくするために使います。
Seriesの要素へのアクセス
インデックスを使って、Seriesの個々の要素や複数の要素にアクセスできます。
“`python
インデックスを使って要素にアクセス
print(“インデックス ‘c’ の値:”, s3[‘c’])
print(“インデックス 2 の値:”, s3[2]) # デフォルトの整数インデックスも使える (ただし、インデックスが数値ラベルの場合は注意が必要)
print(“-” * 20)
スライスを使って複数の要素にアクセス
print(“インデックス ‘b’ から ‘d’ までのスライス (ラベル):”)
print(s3[‘b’:’d’]) # ラベルスライスは終了ラベルを含む
print(“-” * 20)
print(“インデックス 1 から 4 までのスライス (位置):”)
print(s3[1:4]) # 位置スライスは終了位置を含まない (Pythonのリストスライスと同じ挙動)
print(“-” * 20)
インデックスのリストを使って複数の要素にアクセス
print(“インデックス ‘a’ と ‘e’ の値:”)
print(s3[[‘a’, ‘e’]])
print(“-” * 20)
“`
実行結果:
“`
インデックス ‘c’ の値: 30
インデックス 2 の値: 30
インデックス ‘b’ から ‘d’ までのスライス (ラベル):
b 20
c 30
d 40
dtype: int64
インデックス 1 から 4 までのスライス (位置):
b 20
c 30
d 40
dtype: int64
インデックス ‘a’ と ‘e’ の値:
a 10
e 50
dtype: int64
“`
ラベルを使ったスライス(s3['b':'d']
)は、NumPyやPythonのリストとは異なり、終了ラベルを含むという点に注意が必要です。一方、位置を使ったスライス(s3[1:4]
)はPythonのリストスライスと同じく、終了位置を含みません。
Seriesを使った計算
SeriesはNumPy配列のように、要素ごとの計算が可能です。
“`python
print(“s3の値を2倍:”)
print(s3 * 2)
print(“-” * 20)
print(“s3にs3を足す (インデックスが一致する要素同士が計算される):”)
print(s3 + s3)
print(“-” * 20)
インデックスが異なるSeries同士の計算
s5 = pd.Series({‘apple’: 10, ‘banana’: 20, ‘cherry’: 30})
print(“s4とs5を足す (インデックスが一致しない部分はNaNになる):”)
print(s4 + s5)
“`
実行結果:
“`
s3の値を2倍:
a 20
b 40
c 60
d 80
e 100
dtype: int64
s3にs3を足す (インデックスが一致する要素同士が計算される):
a 20
b 40
c 60
d 80
e 100
dtype: int64
s4とs5を足す (インデックスが一致しない部分はNaNになる):
apple 160.0
banana 100.0
cherry NaN
grape NaN
orange NaN
dtype: float64
“`
最後の例のように、インデックスが一致しないSeries同士を計算すると、一致しないインデックスの要素の結果はNaN
(Not a Number、欠損値を表す)になります。pandasはデータの整合性を保ちつつ、柔軟な演算を可能にします。
SeriesはDataFrameの基本的な構成要素であり、単一の列やベクトルデータを扱う際に非常に便利です。次に、より強力なデータ構造であるDataFrameを見ていきましょう。
6. pandasの基本的な使い方 – DataFrame入門
DataFrameは、pandasにおける最も重要なデータ構造です。Seriesが1次元データであったのに対し、DataFrameは2次元のラベル付きデータ構造であり、異なる型の列を持つことができます。これは、スプレッドシートやリレーショナルデータベースのテーブルをイメージすると分かりやすいでしょう。
DataFrameとは?
- 行と列を持つ表形式のデータ。
- 各列は異なるデータ型を持つことができる(整数、浮動小数点数、文字列、日付など)。
- 行と列の両方にラベル(インデックスと列名)を持つ。
基本的なDataFrameの作成
DataFrameを作成する方法はいくつかありますが、最も一般的なのは辞書を使う方法です。
“`python
import pandas as pd
辞書からDataFrameを作成
キーが列名、値がその列のデータ (リストやSeriesなど)
data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’, ‘Eva’],
‘Age’: [25, 30, 35, 28, 32],
‘City’: [‘New York’, ‘Paris’, ‘London’, ‘Tokyo’, ‘Sydney’]
}
df = pd.DataFrame(data)
print(“辞書から作成したDataFrame:”)
print(df)
print(“-” * 20)
“`
実行結果:
“`
辞書から作成したDataFrame:
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
3 David 28 Tokyo
4 Eva 32 Sydney
“`
辞書のキーが列名(Name
, Age
, City
)になり、辞書の値(リスト)がそれぞれの列のデータになっています。左側の0から始まる数字は行インデックスです。列インデックスは自動的に辞書のキーが使われます。
行インデックスを指定してDataFrameを作成
Seriesと同様に、DataFrameも作成時に独自の行インデックスを指定できます。
“`python
行インデックスを指定してDataFrameを作成
my_index = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]
df_indexed = pd.DataFrame(data, index=my_index)
print(“行インデックスを指定して作成したDataFrame:”)
print(df_indexed)
print(“-” * 20)
“`
実行結果:
“`
行インデックスを指定して作成したDataFrame:
Name Age City
A Alice 25 New York
B Bob 30 Paris
C Charlie 35 London
D David 28 Tokyo
E Eva 32 Sydney
“`
リストのリストからDataFrameを作成
行ごとにデータをリストとして持ち、それらをまとめたリストからDataFrameを作成することもできます。この場合、列名とインデックスは別途指定する必要があります。
“`python
リストのリストからDataFrameを作成
data_list_of_lists = [
[‘Alice’, 25, ‘New York’],
[‘Bob’, 30, ‘Paris’],
[‘Charlie’, 35, ‘London’],
[‘David’, 28, ‘Tokyo’],
[‘Eva’, 32, ‘Sydney’]
]
column_names = [‘Name’, ‘Age’, ‘City’]
df_from_lists = pd.DataFrame(data_list_of_lists, columns=column_names)
print(“リストのリストから作成したDataFrame:”)
print(df_from_lists)
print(“-” * 20)
“`
実行結果:
“`
リストのリストから作成したDataFrame:
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
3 David 28 Tokyo
4 Eva 32 Sydney
“`
DataFrameの基本的な情報表示
DataFrameを作成したら、その内容や構造を確認するためのメソッドが多数用意されています。
“`python
print(“先頭5行を表示 (head()):”)
print(df.head()) # デフォルトは5行
print(“-” * 20)
print(“末尾3行を表示 (tail(3)):”)
print(df.tail(3))
print(“-” * 20)
print(“DataFrameの基本情報を表示 (info()):”)
df.info()
print(“-” * 20)
print(“数値列の統計情報を表示 (describe()):”)
print(df.describe())
print(“-” * 20)
print(“DataFrameの形状 (行数, 列数) を表示 (shape):”)
print(df.shape)
print(“-” * 20)
print(“列名を表示 (columns):”)
print(df.columns)
print(“-” * 20)
print(“行インデックスを表示 (index):”)
print(df.index)
print(“-” * 20)
print(“各列のデータ型を表示 (dtypes):”)
print(df.dtypes)
print(“-” * 20)
“`
実行結果(一部):
“`
先頭5行を表示 (head()):
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
3 David 28 Tokyo
4 Eva 32 Sydney
末尾3行を表示 (tail(3)):
Name Age City
2 Charlie 35 London
3 David 28 Tokyo
4 Eva 32 Sydney
DataFrameの基本情報を表示 (info()):
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
# Column Non-Null Count Dtype
0 Name 5 non-null object
1 Age 5 non-null int64
2 City 5 non-null object
dtypes: int64(1), object(2)
memory usage: 200.0+ bytes
数値列の統計情報を表示 (describe()):
Age
count 5.0
mean 30.0
std 3.9
min 25.0
25% 28.0
50% 30.0
75% 32.0
max 35.0
DataFrameの形状 (行数, 列数) を表示 (shape):
(5, 3)
列名を表示 (columns):
Index([‘Name’, ‘Age’, ‘City’], dtype=’object’)
行インデックスを表示 (index):
RangeIndex(start=0, stop=5, step=1)
各列のデータ型を表示 (dtypes):
Name object
Age int64
City object
dtype: object
“`
これらのメソッドは、データセットの最初の探索(EDA)において非常に重要です。データが期待通りの形式で読み込まれているか、欠損値はどのくらいあるか(info()
のNon-Null Count)、数値データの分布はどうか(describe()
)などを素早く把握できます。
列の選択
DataFrameから特定の列を選択するには、列名を指定します。単一の列を選択するとSeriesが、複数の列を選択するとDataFrameが返されます。
“`python
単一の列を選択 (Seriesが返される)
ages = df[‘Age’]
print(“単一の列 ‘Age’ を選択:”)
print(ages)
print(type(ages)) # 結果はSeries
print(“-” * 20)
複数の列を選択 (DataFrameが返される)
name_city = df[[‘Name’, ‘City’]]
print(“複数の列 ‘Name’ と ‘City’ を選択:”)
print(name_city)
print(type(name_city)) # 結果はDataFrame
print(“-” * 20)
ドット記法で列にアクセス (列名にスペースや特殊文字がない場合のみ)
print(df.Age) # これも可能だが、[‘Age’] の方が一般的で安全
“`
実行結果(一部):
“`
単一の列 ‘Age’ を選択:
0 25
1 30
2 35
3 28
4 32
Name: Age, dtype: int64
複数の列 ‘Name’ と ‘City’ を選択:
Name City
0 Alice New York
1 Bob Paris
2 Charlie London
3 David Tokyo
4 Eva Sydney
“`
行の選択 (loc
と iloc
)
DataFrameから特定の行を選択するには、.loc
または.iloc
アクセサを使用するのが一般的です。
.loc
: ラベルに基づいて行を選択します。行インデックスラベルやブール配列を指定できます。.iloc
: 位置に基づいて行を選択します。0から始まる整数位置を指定できます。
“`python
インデックスが数字のDataFrameを使用
print(df)
print(“-” * 20)
.loc による行選択 (ラベル)
print(“.loc でインデックスラベル ‘0’ の行を選択:”)
print(df.loc[0]) # インデックスラベルが0の行
print(“-” * 20)
print(“.loc でインデックスラベルのリスト [0, 2] の行を選択:”)
print(df.loc[[0, 2]]) # インデックスラベル0と2の行
print(“-” * 20)
print(“.loc でインデックスラベル 0 から 2 までの行を選択 (ラベルスライス):”)
print(df.loc[0:2]) # ラベルスライスなので終了ラベル2を含む
print(“-” * 20)
.iloc による行選択 (位置)
print(“.iloc で位置 0 の行を選択:”)
print(df.iloc[0]) # 0番目の行
print(“-” * 20)
print(“.iloc で位置のリスト [0, 2] の行を選択:”)
print(df.iloc[[0, 2]]) # 0番目と2番目の行
print(“-” * 20)
print(“.iloc で位置 0 から 3 までの行を選択 (位置スライス):”)
print(df.iloc[0:3]) # 位置スライスなので終了位置3を含まない (0, 1, 2番目の行)
print(“-” * 20)
インデックスが文字列のDataFrameを使用
print(df_indexed)
print(“-” * 20)
print(“.loc でインデックスラベル ‘B’ の行を選択:”)
print(df_indexed.loc[‘B’])
print(“-” * 20)
print(“.loc でインデックスラベル ‘A’ から ‘C’ までの行を選択:”)
print(df_indexed.loc[‘A’:’C’])
print(“-” * 20)
print(“.iloc で位置 1 の行を選択:”)
print(df_indexed.iloc[1]) # 0, 1, 2, 3, 4番目の位置
print(“-” * 20)
“`
実行結果(一部):
“`
.loc でインデックスラベル ‘0’ の行を選択:
Name Alice
Age 25
City New York
Name: 0, dtype: object
.loc でインデックスラベルのリスト [0, 2] の行を選択:
Name Age City
0 Alice 25 New York
2 Charlie 35 London
.loc でインデックスラベル 0 から 2 までの行を選択 (ラベルスライス):
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
.iloc で位置 0 の行を選択:
Name Alice
Age 25
City New York
Name: 0, dtype: object
.iloc で位置のリスト [0, 2] の行を選択:
Name Age City
0 Alice 25 New York
2 Charlie 35 London
.iloc で位置 0 から 3 までの行を選択 (位置スライス):
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
.loc でインデックスラベル ‘B’ の行を選択:
Name Bob
Age 30
City Paris
Name: B, dtype: object
.loc でインデックスラベル ‘A’ から ‘C’ までの行を選択:
Name Age City
A Alice 25 New York
B Bob 30 Paris
C Charlie 35 London
.iloc で位置 1 の行を選択:
Name Bob
Age 30
City Paris
Name: B, dtype: object
“`
loc
とiloc
は、行だけでなく、列も同時に指定して特定のセルやブロックを選択するのに使われます。書式は df.loc[行の指定, 列の指定]
または df.iloc[行の指定, 列の指定]
です。
“`python
.loc で特定のセルを選択 (ラベル)
print(“.loc でインデックスラベル 1 の ‘Name’ 列の値:”)
print(df.loc[1, ‘Name’]) # 行ラベル1、列ラベル’Name’
print(“-” * 20)
.iloc で特定のセルを選択 (位置)
print(“.iloc で位置 1 の位置 0 のセルの値:”)
print(df.iloc[1, 0]) # 1番目の行、0番目の列
print(“-” * 20)
.loc で行と列を範囲指定
print(“.loc でインデックスラベル 0 から 2 の行、かつ ‘Name’ から ‘Age’ の列:”)
print(df.loc[0:2, ‘Name’:’Age’]) # 行ラベル0,1,2、列ラベル’Name’,’Age’
print(“-” * 20)
.iloc で行と列を範囲指定
print(“.iloc で位置 0 から 3 の行、かつ位置 0 から 2 の列:”)
print(df.iloc[0:3, 0:2]) # 行位置0,1,2、列位置0,1
print(“-” * 20)
.loc とリストで複数の行と列を選択
print(“.loc でインデックスラベル [0, 4] の行、かつ列ラベル [‘Name’, ‘City’]:”)
print(df.loc[[0, 4], [‘Name’, ‘City’]])
print(“-” * 20)
“`
実行結果(一部):
“`
.loc でインデックスラベル 1 の ‘Name’ 列の値:
Bob
.iloc で位置 1 の位置 0 のセルの値:
Bob
.loc でインデックスラベル 0 から 2 の行、かつ ‘Name’ から ‘Age’ の列:
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
.iloc で位置 0 から 3 の行、かつ位置 0 から 2 の列:
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
.loc でインデックスラベル [0, 4] の行、かつ列ラベル [‘Name’, ‘City’] を選択:
Name City
0 Alice New York
4 Eva Sydney
“`
loc
とiloc
は非常に強力で、DataFrameのデータ選択の基本となるため、しっかりと理解することが重要です。特にラベルスライスと位置スライスの挙動の違いに注意してください。
条件によるデータの抽出(ブールインデックス)
特定の条件を満たす行だけを抽出したい場合、ブールインデックス(条件式の結果がTrue/FalseのSeriesやNumPy配列)を使います。
“`python
Ageが30以上の行を抽出
condition = df[‘Age’] >= 30
print(“条件式 (Age >= 30):”)
print(condition) # 結果はSeries (True/False)
print(“-” * 20)
print(“条件を満たす行を抽出:”)
print(df[condition]) # または df[df[‘Age’] >= 30]
print(“-” * 20)
条件を満たす行の特定の列を抽出
print(“Ageが30以上の人の名前と都市:”)
print(df[df[‘Age’] >= 30][[‘Name’, ‘City’]])
print(“-” * 20)
複数の条件
論理積 (&): 条件1 かつ 条件2
print(“Ageが30以上 かつ CityがLondonの人の行:”)
print(df[(df[‘Age’] >= 30) & (df[‘City’] == ‘London’)])
print(“-” * 20)
論理和 (|): 条件1 または 条件2
print(“Ageが25歳未満 または CityがParisの人の行:”)
print(df[(df[‘Age’] < 25) | (df[‘City’] == ‘Paris’)])
print(“-” * 20)
否定 (~): 条件を満たさない行
print(“CityがTokyoではない人の行:”)
print(df[~(df[‘City’] == ‘Tokyo’)])
print(“-” * 20)
“`
実行結果(一部):
“`
条件式 (Age >= 30):
0 False
1 True
2 True
3 False
4 True
Name: Age, dtype: bool
条件を満たす行を抽出:
Name Age City
1 Bob 30 Paris
2 Charlie 35 London
4 Eva 32 Sydney
Ageが30以上の人の名前と都市:
Name City
1 Bob Paris
2 Charlie London
4 Eva Sydney
Ageが30以上 かつ CityがLondonの人の行:
Name Age City
2 Charlie 35 London
Ageが25歳未満 または CityがParisの人の行:
Name Age City
1 Bob 30 Paris
CityがTokyoではない人の行:
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
4 Eva 32 Sydney
“`
条件式で複数の列を扱う場合、各条件式をかっこ ()
で囲む必要があることに注意してください。これは、Pythonの通常の論理演算子 (and
, or
, not
) ではなく、ビット演算子 (&
, |
, ~
) を使うためです。
列の追加、変更、削除
DataFrameに新しい列を追加したり、既存の列の値を変更したり、列を削除したりするのは簡単です。
“`python
新しい列を追加
リストや配列を代入 (要素数は既存の行数と一致させる必要あり)
df[‘Country’] = [‘USA’, ‘France’, ‘UK’, ‘Japan’, ‘Australia’]
print(“列 ‘Country’ を追加後:”)
print(df)
print(“-” * 20)
列の値を変更
条件に基づいて値を変更することも可能
df.loc[df[‘City’] == ‘New York’, ‘Country’] = ‘United States’
print(“CityがNew Yorkの行のCountryを’United States’に変更後:”)
print(df)
print(“-” * 20)
既存の列の値を計算で変更
df[‘Age’] = df[‘Age’] + 1 # 全員の年齢を1歳増やす
print(“Age列を1歳増加後:”)
print(df)
print(“-” * 20)
列を削除
del文を使う
del df[‘Country’]
print(“delで列 ‘Country’ を削除後:”)
print(df)
print(“-” * 20)
dropメソッドを使う (columns引数で列を指定)
inplace=True を指定すると元のDataFrameが変更される (デフォルトはFalse)
df.drop(columns=[‘City’], inplace=True)
print(“dropメソッドで列 ‘City’ を削除後:”)
print(df)
print(“-” * 20)
削除した列を元に戻すために再作成
data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’, ‘Eva’],
‘Age’: [26, 31, 36, 29, 33], # Ageは増えたまま
‘City’: [‘New York’, ‘Paris’, ‘London’, ‘Tokyo’, ‘Sydney’]
}
df = pd.DataFrame(data)
print(“City列を元に戻したDataFrame:”)
print(df)
print(“-” * 20)
“`
実行結果(一部):
“`
列 ‘Country’ を追加後:
Name Age City Country
0 Alice 25 New York USA
1 Bob 30 Paris France
2 Charlie 35 London UK
3 David 28 Tokyo Japan
4 Eva 32 Sydney Australia
CityがNew Yorkの行のCountryを’United States’に変更後:
Name Age City Country
0 Alice 25 New York United States
1 Bob 30 Paris France
2 Charlie 35 London UK
3 David 28 Tokyo Japan
4 Eva 32 Sydney Australia
Age列を1歳増加後:
Name Age City Country
0 Alice 26 New York United States
1 Bob 31 Paris France
2 Charlie 36 London UK
3 David 29 Tokyo Japan
4 Eva 33 Sydney Australia
delで列 ‘Country’ を削除後:
Name Age City
0 Alice 26 New York
1 Bob 31 Paris
2 Charlie 36 London
3 David 29 Tokyo
4 Eva 33 Sydney
dropメソッドで列 ‘City’ を削除後:
Name Age
0 Alice 26
1 Bob 31
2 Charlie 36
3 David 29
4 Eva 33
City列を元に戻したDataFrame:
Name Age City
0 Alice 26 New York
1 Bob 31 Paris
2 Charlie 36 London
3 David 29 Tokyo
4 Eva 33 Sydney
“`
列の削除にはdel
文とdrop
メソッドがあります。del
は元のDataFrameから列を直接削除します。drop
メソッドはデフォルトでは削除した列を含まない新しいDataFrameを返しますが、inplace=True
を指定すると元のDataFrameが変更されます。データ操作では、元のデータを変更しない(inplace=False
のままにする)方が、意図しないデータの変更を防ぎやすく、コードの追跡も容易になるため推奨されることが多いです。
行の追加と削除
行の追加は、DataFrameを結合する形で行うのが一般的です(pd.concat
など)。古いバージョンのpandasではappend
メソッドがありましたが、これは非推奨となっています。新しい行データを持つDataFrameを作成し、既存のDataFrameと結合することを検討してください。
行の削除はdrop
メソッドを使って行います。index
引数で行インデックスを指定します。
“`python
行を削除 (dropメソッド)
インデックスラベル1と3の行を削除
df_dropped_rows = df.drop(index=[1, 3])
print(“インデックスラベル1と3の行を削除後:”)
print(df_dropped_rows)
print(“-” * 20)
inplace=True を使う場合は注意
df.drop(index=[1, 3], inplace=True) # 元のDataFrameが変更される
“`
実行結果:
“`
インデックスラベル1と3の行を削除後:
Name Age City
0 Alice 26 New York
2 Charlie 36 London
4 Eva 33 Sydney
“`
ここではinplace=False
(デフォルト)なので、元のdf
は変更されておらず、削除結果は新しいDataFramedf_dropped_rows
に格納されています。
7. データの読み込み/書き込み
データ分析の多くは、CSVやExcelファイルなどの外部データから始まります。pandasは様々な形式のデータを簡単に読み書きする機能を提供しています。
CSVファイルの読み込み (read_csv
)
最も一般的で重要な機能の一つです。
まず、読み込むためのサンプルCSVファイルを作成しましょう。Pythonでファイルに書き込むか、手動でテキストエディタなどで作成してください。ファイル名をsample.csv
とします。
csv
Name,Age,City,Country
Alice,26,New York,United States
Bob,31,Paris,France
Charlie,36,London,UK
David,29,Tokyo,Japan
Eva,33,Sydney,Australia
これをPythonスクリプトと同じディレクトリに保存したと仮定します。
“`python
CSVファイルを読み込む
try:
df_from_csv = pd.read_csv(‘sample.csv’)
print(“CSVファイルから読み込んだDataFrame:”)
print(df_from_csv)
print(“-” * 20)
except FileNotFoundError:
print(“エラー: sample.csv が見つかりません。ファイルが正しいパスに存在するか確認してください。”)
オプション: インデックス列を指定する
CSVの特定の列を行インデックスとして読み込みたい場合
例: Name列を行インデックスにする (現実的にはあまりないかもしれないが例として)
df_indexed_from_csv = pd.read_csv(‘sample.csv’, index_col=’Name’)
print(“\nName列をインデックスとして読み込んだDataFrame:”)
print(df_indexed_from_csv)
print(“-” * 20)
“`
実行結果(sample.csv
が見つかった場合):
“`
CSVファイルから読み込んだDataFrame:
Name Age City Country
0 Alice 26 New York United States
1 Bob 31 Paris France
2 Charlie 36 London UK
3 David 29 Tokyo Japan
4 Eva 33 Sydney Australia
“`
pd.read_csv()
は非常に多くのオプションを持っています。よく使うものをいくつか挙げます。
filepath_or_buffer
: ファイルパスまたはURL。sep
: 区切り文字を指定(デフォルトはカンマ,
)。タブ区切りの場合は'\t'
、スペース区切りの場合は'\s+'
などを指定。header
: ヘッダー行を指定(デフォルトは0番目の行)。ヘッダーがない場合はNone
を指定。index_col
: どの列を行インデックスとして使うかを指定(列名または列番号)。dtype
: 各列のデータ型を指定。encoding
: ファイルのエンコーディングを指定(例:'utf-8'
,'shift_jis'
,'cp932'
)。日本語ファイルで文字化けする場合によく使います。na_values
: 欠損値として扱う値を指定(例:['N/A', '?', '-']
)。
CSVファイルへの書き込み (to_csv
)
DataFrameをCSVファイルとして保存するには、to_csv()
メソッドを使用します。
“`python
DataFrameをCSVファイルに書き出す
df.to_csv(‘output.csv’, index=False) # index=False で行インデックスをファイルに書き込まないようにする
print(“DataFrameを output.csv に書き出しました。”)
オプション: 区切り文字を指定して書き出す
df.to_csv(‘output_tab.tsv’, sep=’\t’, index=False)
オプション: 特定の列だけ書き出す
df[[‘Name’, ‘Age’]].to_csv(‘output_subset.csv’, index=False)
“`
to_csv()
の主なオプション:
path_or_buf
: 書き出し先のファイルパスまたはバッファ。sep
: 区切り文字を指定(デフォルトはカンマ,
)。index
:True
の場合、行インデックスを最初の列として書き出す(デフォルトはTrue
)。通常はFalse
にすることが多いです。header
:True
の場合、列名をヘッダーとして書き出す(デフォルトはTrue
)。encoding
: ファイルのエンコーディングを指定。na_rep
: 欠損値 (NaN
) をどのように表現するか指定(デフォルトは空文字列)。
これで、読み込んだり操作したりしたデータをファイルに保存することができます。
その他のファイル形式
pandasはCSV以外にも多くのファイル形式に対応しています。
- Excel:
pd.read_excel()
,df.to_excel()
- JSON:
pd.read_json()
,df.to_json()
- SQLデータベース:
pd.read_sql()
,df.to_sql()
- HTML:
pd.read_html()
,df.to_html()
- Parquet, ORC, Feather など高速なバイナリ形式もサポート。
これらの使い方もread_csv
/to_csv
と似ており、それぞれのファイル形式に対応したオプションが用意されています。
8. データ操作の基本
DataFrameを読み込んだら、次はデータを加工・集計するステップです。ここでは、データ分析で頻繁に行われる基本的な操作をいくつか紹介します。
欠損値の扱い
現実のデータには、しばしば欠損値が含まれています。pandasでは欠損値をNaN
(Not a Number)として扱います。欠損値の確認、削除、補完の方法を見ていきましょう。
“`python
欠損値を含むサンプルDataFrameを作成
data_missing = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’, ‘Eva’],
‘Age’: [26, 31, np.nan, 29, 33], # Charlieの年齢が欠損
‘City’: [‘New York’, ‘Paris’, ‘London’, np.nan, ‘Sydney’], # Davidの都市が欠損
‘Score’: [85, 92, 78, np.nan, 95] # Davidのスコアが欠損
}
df_missing = pd.DataFrame(data_missing)
print(“欠損値を含むDataFrame:”)
print(df_missing)
print(“-” * 20)
欠損値があるか確認 (isnull() または isna())
print(“各要素が欠損値かどうかの判定:”)
print(df_missing.isnull()) # または df_missing.isna()
print(“-” * 20)
欠損値がないか確認 (notnull() または notna())
print(“各要素が欠損値でないかどうかの判定:”)
print(df_missing.notnull()) # または df_missing.notna()
print(“-” * 20)
列ごとの欠損値の数を数える
print(“列ごとの欠損値の数:”)
print(df_missing.isnull().sum())
print(“-” * 20)
欠損値を含む行を削除 (dropna())
axis=0 (デフォルト) は行、axis=1 は列を指定
how=’any’ (デフォルト) は一つでも欠損値があれば削除
how=’all’ は全ての値が欠損している場合のみ削除
df_dropped_rows = df_missing.dropna()
print(“欠損値を含む行を削除後 (dropna()):”)
print(df_dropped_rows)
print(“-” * 20)
欠損値を含む列を削除 (慎重に!)
df_dropped_cols = df_missing.dropna(axis=1)
print(“欠損値を含む列を削除後 (dropna(axis=1)):”)
print(df_dropped_cols)
print(“-” * 20)
欠損値を特定の値で埋める (fillna())
例: Ageの欠損値を平均値で埋める
mean_age = df_missing[‘Age’].mean()
df_filled_age = df_missing.copy() # fillnaは元のDataFrameを変更しないのでコピーを作成 (inplace=Trueで元のを変更可)
df_filled_age[‘Age’] = df_filled_age[‘Age’].fillna(mean_age)
print(“Age列の欠損値を平均値で埋めた後:”)
print(df_filled_age)
print(“-” * 20)
例: Cityの欠損値を最頻値 (モード) で埋める
mode_city = df_missing[‘City’].mode()[0] # mode()はSeriesを返すため[0]で値を取り出す
df_filled_city = df_missing.copy()
df_filled_city[‘City’] = df_filled_city[‘City’].fillna(mode_city)
print(“City列の欠損値を最頻値で埋めた後:”)
print(df_filled_city)
print(“-” * 20)
例: 欠損値を直前の有効な値で埋める (ffill または pad)
df_filled_ffill = df_missing.copy()
df_filled_ffill[‘City’] = df_filled_ffill[‘City’].fillna(method=’ffill’)
print(“City列の欠損値を直前の値で埋めた後 (ffill):”)
print(df_filled_ffill)
print(“-” * 20)
例: 欠損値を特定の列の値で埋める
この例では使えないが、例えば ‘Region’ 列が欠損している場合に ‘Country’ 列の値で埋めるなど
df_missing[‘Region’] = df_missing[‘Region’].fillna(df_missing[‘Country’])
“`
実行結果(一部):
“`
欠損値を含むDataFrame:
Name Age City Score
0 Alice 26.0 New York 85.0
1 Bob 31.0 Paris 92.0
2 Charlie NaN London 78.0
3 David 29.0 NaN NaN
4 Eva 33.0 Sydney 95.0
各要素が欠損値かどうかの判定:
Name Age City Score
0 False False False False
1 False False False False
2 False True False False
3 False False True True
4 False False False False
列ごとの欠損値の数:
Name 0
Age 1
City 1
Score 1
dtype: int64
欠損値を含む行を削除後 (dropna()):
Name Age City Score
0 Alice 26.0 New York 85.0
1 Bob 31.0 Paris 92.0
4 Eva 33.0 Sydney 95.0
Age列の欠損値を平均値で埋めた後:
Name Age City Score
0 Alice 26.0 New York 85.0
1 Bob 31.0 Paris 92.0
2 Charlie 29.7 London 78.0
3 David 29.0 NaN NaN
4 Eva 33.0 Sydney 95.0
City列の欠損値を最頻値で埋めた後:
Name Age City Score
0 Alice 26.0 New York 85.0
1 Bob 31.0 Paris 92.0
2 Charlie NaN London 78.0
3 David 29.0 London NaN
4 Eva 33.0 Sydney 95.0
City列の欠損値を直前の値で埋めた後 (ffill):
Name Age City Score
0 Alice 26.0 New York 85.0
1 Bob 31.0 Paris 92.0
2 Charlie NaN London 78.0
3 David 29.0 London NaN
4 Eva 33.0 Sydney 95.0
“`
欠損値処理はデータ分析の重要なステップです。欠損値をどう扱うか(削除するか、補完するか、どの値で補完するかなど)は、分析の目的に応じて慎重に判断する必要があります。
データの並べ替え (sort_values
, sort_index
)
DataFrameを行または列で並べ替えることができます。
sort_values()
: 特定の列の値に基づいて並べ替えます。sort_index()
: 行インデックスまたは列インデックスに基づいて並べ替えます。
“`python
DataFrameをAge列の値で並べ替え
ascending=True (デフォルト) は昇順、False は降順
df_sorted_age = df.sort_values(by=’Age’, ascending=True)
print(“Age列で昇順に並べ替え後:”)
print(df_sorted_age)
print(“-” * 20)
複数の列で並べ替え (リストで指定)
例: Cityで昇順、次にAgeで降順に並べ替え
df_sorted_multi = df.sort_values(by=[‘City’, ‘Age’], ascending=[True, False])
print(“Cityで昇順、Ageで降順に並べ替え後:”)
print(df_sorted_multi)
print(“-” * 20)
行インデックスで並べ替え (ここではデフォルトのRangeIndexなので元の順序と同じになる)
df_sorted_index = df.sort_index()
print(“行インデックスで並べ替え後:”)
print(df_sorted_index)
print(“-” * 20)
列インデックスで並べ替え
df_sorted_columns = df.sort_index(axis=1)
print(“列インデックスで並べ替え後:”)
print(df_sorted_columns)
print(“-” * 20)
“`
実行結果(一部):
“`
Age列で昇順に並べ替え後:
Name Age City
0 Alice 26 New York
3 David 29 Tokyo
1 Bob 31 Paris
4 Eva 33 Sydney
2 Charlie 36 London
Cityで昇順、Ageで降順に並べ替え後:
Name Age City
4 Eva 33 Sydney
2 Charlie 36 London
0 Alice 26 New York
1 Bob 31 Paris
3 David 29 Tokyo
行インデックスで並べ替え後:
Name Age City
0 Alice 26 New York
1 Bob 31 Paris
2 Charlie 36 London
3 David 29 Tokyo
4 Eva 33 Sydney
列インデックスで並べ替え後:
Age City Name
0 26 New York Alice
1 31 Paris Bob
2 36 London Charlie
3 29 Tokyo David
4 33 Sydney Eva
“`
並べ替えもデータ分析の初期段階で頻繁に行われます。特に時系列データやランキングデータなどを扱う際に重要です。
ユニークな値の取得と度数計算
ある列にどのようなユニークな値が存在するか、それぞれの値が何回出現するかを知りたい場合があります。
“`python
City列のユニークな値を取得
unique_cities = df[‘City’].unique()
print(“City列のユニークな値:”)
print(unique_cities)
print(“-” * 20)
City列の各値の出現回数を数える (度数計算)
降順で表示される
city_counts = df[‘City’].value_counts()
print(“City列の各値の出現回数:”)
print(city_counts)
print(“-” * 20)
“`
実行結果:
“`
City列のユニークな値:
[‘New York’ ‘Paris’ ‘London’ ‘Tokyo’ ‘Sydney’]
City列の各値の出現回数:
New York 1
Paris 1
London 1
Tokyo 1
Sydney 1
Name: City, dtype: int64
“`
value_counts()
は、カテゴリカルデータや離散的な値を持つ列の分布を確認するのに非常に役立ちます。
グループ化と集計 (groupby
)
データ分析において最も強力な操作の一つが、データを特定の基準でグループ分けし、グループごとに集計を行うことです。これはSQLのGROUP BY
句に似ています。
例として、以下のデータを使います。
“`python
data_sales = {
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’],
‘Region’: [‘East’, ‘West’, ‘East’, ‘North’, ‘West’, ‘East’, ‘North’, ‘West’, ‘South’],
‘Sales’: [100, 150, 120, 80, 180, 110, 90, 160, 130],
‘Quantity’: [10, 15, 12, 8, 18, 11, 9, 16, 13]
}
df_sales = pd.DataFrame(data_sales)
print(“売上データ:”)
print(df_sales)
print(“-” * 20)
ProductごとにSalesの合計を計算
df_sales.groupby(‘Product’) でDataFrameGroupByオブジェクトが作成される
その後に集計関数 (.sum(), .mean(), .count() など) を適用
product_sales_sum = df_sales.groupby(‘Product’)[‘Sales’].sum()
print(“ProductごとのSales合計:”)
print(product_sales_sum)
print(“-” * 20)
RegionごとにQuantityの平均を計算
region_quantity_mean = df_sales.groupby(‘Region’)[‘Quantity’].mean()
print(“RegionごとのQuantity平均:”)
print(region_quantity_mean)
print(“-” * 20)
複数の列でグループ化 (リストで指定)
ProductとRegionの組み合わせごとにSalesの合計とQuantityの平均を計算
product_region_agg = df_sales.groupby([‘Product’, ‘Region’]).agg({
‘Sales’: ‘sum’,
‘Quantity’: ‘mean’
})
print(“ProductとRegionの組み合わせごとの集計:”)
print(product_region_agg)
print(“-” * 20)
groupbyの結果はデフォルトで行インデックスになる
.reset_index() を使うと、グループ化に使った列が通常の列に戻り、連番インデックスになる
product_region_agg_reset = product_region_agg.reset_index()
print(“集計結果をreset_index()でDataFrameに戻す:”)
print(product_region_agg_reset)
print(“-” * 20)
“`
実行結果(一部):
“`
売上データ:
Product Region Sales Quantity
0 A East 100 10
1 B West 150 15
2 A East 120 12
3 C North 80 8
4 B West 180 18
5 A East 110 11
6 C North 90 9
7 B West 160 16
8 A South 130 13
ProductごとのSales合計:
Product
A 460
B 490
C 170
Name: Sales, dtype: int64
RegionごとのQuantity平均:
Region
East 11.0
North 8.5
South 13.0
West 16.333333
Name: Quantity, dtype: float64
ProductとRegionの組み合わせごとの集計:
Sales Quantity
Product Region
A East 330 11.0
South 130 13.0
B West 490 16.333333
C North 170 8.5
集計結果をreset_index()でDataFrameに戻す:
Product Region Sales Quantity
0 A East 330 11.000000
1 A South 130 13.000000
2 B West 490 16.333333
3 C North 170 8.500000
“`
groupby()
は非常に強力な機能で、データ分析の様々な場面で利用されます。統計量の計算だけでなく、グループごとの変換やフィルタリングなども行うことができます。
9. まとめ
この記事では、Pythonのデータ分析ライブラリpandasのインストール方法から基本的な使い方までを幅広く解説しました。
- インストール: pipを使って
pip install pandas
を実行することで簡単に導入できます。仮想環境を使うことで、環境間の干渉を防ぎ、クリーンな状態で作業できることを強く推奨しました。 - 基本的なデータ構造: 1次元データのSeriesと2次元(表形式)データのDataFrameについて、それぞれの作成方法や基本的な操作方法を学びました。
- データ操作: 外部ファイルの読み書き、データの表示、特定の行や列の選択(
loc
,iloc
, ブールインデックス)、列の追加・削除、欠損値の処理、データの並べ替え、そして強力なグループ化と集計(groupby
)といった、データ分析の基礎となる操作を多数紹介しました。
pandasはここで紹介した機能以外にも、時系列データ処理、データの結合、ピボットテーブル作成など、非常に多機能です。この記事はpandasの広大な世界への入り口に過ぎません。
データ分析スキルをさらに向上させるためには、以下のステップに進むことをお勧めします。
- 公式ドキュメントを読む: pandasの公式ドキュメントは非常に充実しており、各機能の詳細や様々な使用例が豊富に掲載されています。
- 実際に手を動かす: サンプルデータや自分の持っているデータを使って、今回学んだ操作や新しい操作を試してみてください。エラーに遭遇したり、思った通りの結果が得られなかったりすることが、理解を深める一番の近道です。
- 他のライブラリと連携させる: matplotlibやseabornを使ってDataFrameを可視化したり、scikit-learnを使ってDataFrameを機械学習モデルに入力したりすることで、データ分析パイプライン全体を構築できるようになります。
pandasは、Pythonを使ったデータサイエンスにおいて文字通り「中心的な役割」を果たすライブラリです。この記事で学んだことを足がかりに、ぜひあなたのデータ分析の可能性を広げてください。
データとの対話を楽しむ準備はできましたか? さあ、pandasを使ってあなたのデータを読み込み、探索し、洞察を引き出しましょう!