前回のNumPyで、あなたは大量の数値を光の速さで計算する強力なエンジンを手に入れましたね。しかし、私たちが普段目にするデータ、例えば売上レポートやアンケート結果などを思い浮かべてみてください。それらは単なる数字の羅列でしょうか?
違いますよね。データには「2024年4月の売上」といった行のラベルや、「商品名」「価格」「数量」といった列の名前が必ず付いています。NumPyの配列は、いわばラベルの貼られていない、むき出しの数字の塊。これだけでは、複雑な現実世界のデータを扱うには少し力不足なのです。
そこで登場するのが、今回の主役であるpandas(パンダズ)です!pandasは、NumPyの高速な計算能力を土台に、Excelのような直感的な行・列ラベルを追加した、データ分析のためだけに作られた最強のライブラリ。pandasを使いこなせば、面倒なデータ集計や加工といった作業を、驚くほど簡単に行えるようになりますよ!
pandasを支える二人の主役:SeriesとDataFrame
pandasを理解する上で、絶対に知っておかなければならない2つのデータ構造があります。それがSeries(シリーズ)とDataFrame(データフレーム)です。
Series:ラベル付きの1次元配列
Seriesは、一番シンプルなデータの入れ物です。NumPyの1次元配列に、インデックスと呼ばれるラベルを追加したもの、と考えると分かりやすいでしょう。
イメージは、Excelシートの「A列」だけを抜き出したようなもの。データそのもの(Values)と、それに対応するラベル(Index)がペアになっています。
実際に作ってみましょう。pandasもimport pandas as pdというお約束の書き方で読み込みます。
import pandas as pd
# PythonのリストからSeriesを作成
scores_series = pd.Series([88, 92, 75], index=['Taro', 'Jiro', 'Saburo'])
print(scores_series)
実行結果:
Taro      88
Jiro      92
Saburo    75
dtype: int64
NumPy配列とは違い、各データにTaroやJiroといった名前がついているのが分かりますね。このインデックス名を使えば、データを直感的に取り出せます。
# Jiroさんの点数を取り出す
print(scores_series['Jiro']) # 92
数値の位置(scores_series[1])でも取り出せますが、このラベル機能がpandasをパワフルにする第一歩です。
DataFrame:究極の2次元データ構造
そして、pandasの真の主役がDataFrameです。これは、Excelのシートそのものと考えてください。
DataFrameは、共通のインデックスを持つSeriesを束ねたものです。つまり、行と列の両方にラベルを持つ、2次元の表形式データ構造なのです。これこそが、私たちが分析したいデータの、まさに理想的な姿だと思いませんか?
DataFrameは、Pythonのディクショナリから作るのが最も簡単です。
import pandas as pd
# ディクショナリを用意
# キーが「列名」に、値のリストが「データ」になる
data = {
    '国語': [88, 76, 95],
    '数学': [92, 80, 78],
    '英語': [75, 88, 92]
}
# DataFrameを作成(インデックスも指定)
df = pd.DataFrame(data, index=['Taro', 'Jiro', 'Saburo'])
print(df)
実行結果:
        国語  数学  英語
Taro    88  92  75
Jiro    76  80  88
Saburo  95  78  92
どうでしょう? まるでExcelの表がそのままプログラム内に現れたかのようですね!
DataFrameを自在に操る!必須の基本操作
DataFrameの真価は、その豊富なデータ操作機能にあります。ここでは絶対に覚えておきたい基本操作をいくつか見ていきましょう。
データの選択(これが一番大事!)
DataFrameから目的のデータだけを抜き出す操作は、データ分析の基本中の基本です。
1. 列を選ぶ
列を選ぶのはとても簡単。df['列名']と書くだけです。
# 「数学」の列だけを取り出す
math_scores = df['数学']
print(math_scores)
結果はSeriesとして取り出されます。複数の列を取り出したい場合は、リストで列名を指定します。
# 「国語」と「英語」の列を取り出す
kokugo_eigo = df[['国語', '英語']]
print(kokugo_eigo)
こちらはDataFrameとして取り出されます。
2. 行を選ぶ(.locを使おう!)
行を選ぶときは.loc[]という特別な道具を使います。locは "location" の略で、インデックスのラベル名で指定します。
# 「Jiro」さんの行データを取り出す
jiro_data = df.loc['Jiro']
print(jiro_data)
3. 行と列を同時に選ぶ
.locは、df.loc[行ラベル, 列ラベル]という形で、行と列を同時に指定することもできます。
# 「Saburo」さんの「国語」の点数
saburo_kokugo = df.loc['Saburo', '国語']
print(saburo_kokugo) # 95
条件に合うデータだけを絞り込む!
pandasが最も輝く瞬間の一つが、この条件による絞り込み(フィルタリング)です。例えば、「数学の点数が80点より高い人」のデータだけを抜き出してみましょう。
# まず、条件式を書く
condition = df['数学'] > 80
print(condition)
このconditionを実行すると、TrueかFalseのSeriesが返ってきます。
Taro       True
Jiro      False
Saburo    False
Name: 数学, dtype: bool
Taroさんだけが条件に合致していますね。そして、このTrue/FalseのSeriesをDataFrameにそのまま使うと…
# Trueの行だけが抽出される!
high_scorers = df[condition]
print(high_scorers)
実行結果:
      国語  数学  英語
Taro  88  92  75
見事に、条件に合うTaroさんのデータだけを抜き出すことができました! df[df['列名'] 条件] というこの書き方は、本当によく使うので、呪文のように覚えてしまいましょう!
まとめ:データ分析の頼れる相棒
お疲れ様でした!今回は、データ分析の主役であるpandasの基本を学びました。
- pandasは、ラベル付きのデータを扱うためのライブラリ。
 - Seriesは、ラベル付きの1次元データ(Excelの1列)。
 - DataFrameは、行と列にラベルを持つ2次元データ(Excelのシートそのもの)。
 .locを使えば行を、['列名']で列を自在に選択できる。df[df['列'] > 値]の形で、条件に合うデータだけを簡単に絞り込める。
pandasは、NumPyという強力な計算エンジンに、人間が直感的に理解できる「ラベル」というインターフェースを与えてくれる、まさにデータ分析の頼れる相棒です。
さて、これであなたは現実世界の複雑なデータを読み込み、整理し、意味のある情報(例えば「数学で80点以上の生徒」)を抽出する技術を手に入れました。しかし、数字や表をじっと眺めているだけでは、データの持つ本当のストーリーは見えてきません。
次章では、このpandasで整理したデータを「可視化」する、つまりグラフにするためのライブラリ「Matplotlib」を学びます。データを「見る」ことで、分析はもっと速く、もっと深く、そしてもっと楽しくなりますよ!ぜひ、期待していてください。
まとめができたら、アウトプットとして演習問題にチャレンジしましょう。