【完全攻略】Axis=0と1の呪いを解く!「縦か横か」迷わなくなる直感的イメージ法
こんにちは。ゆうせいです。
Pythonでデータ分析を始めて、pandasやNumPyを使い始めた新人エンジニアのみなさん。必ず一度は頭を抱える「ある問題」がありますよね。
そう、「Axis(アクシス)問題」です。
df.sum(axis=0) と書いたとき、計算されるのは縦の合計なのか、横の合計なのか。「行(Row)」なのか「列(Column)」なのか。
調べても「Axis=0は行、Axis=1は列」と書いてあったりして、いざ合計を出そうとすると直感と逆の結果が出てきてパニックになる……。そんな経験はありませんか?
今日は、このややこしい axis パラメータを、暗記ではなく「イメージ」で一発で理解する方法を解説します。これを読めば、もう二度と「どっちだっけ?」と迷わなくなりますよ。
結論:「矢印の向き」で覚えよう
まず、「行」とか「列」という言葉はいったん忘れてください。これが混乱の元です。
代わりに、「矢印が走る方向」をイメージしてください。
- Axis = 0 : 縦方向 ↓ (上から下へ)
- Axis = 1 : 横方向 → (左から右へ)
これだけです。この矢印のイメージさえあれば、あらゆる操作が理解できます。
「集計(sum, mean)」は「潰す」イメージで!
もっとも混乱しやすいのが、合計(sum)や平均(mean)を計算するときです。
ここで魔法の言葉を授けます。
「指定したAxisの矢印方向に串刺しにして、ペチャンコに潰す」
具体的に見てみましょう。
ここに、あるクラスのテストの点数表があります。
| 数学 | 英語 | 国語 | |
| Aさん | 80 | 90 | 70 |
| Bさん | 60 | 50 | 60 |
| Cさん | 100 | 100 | 100 |
これをデータフレーム(行列)だと思ってください。
Axis = 0 (縦方向 ↓) の場合
df.mean(axis=0) を実行するとどうなるでしょうか。
- 矢印のイメージ: 上から下へ(↓)矢印が走ります。
- 潰すイメージ: この表を、上からギュッと踏み潰して、一行にまとめてしまうと想像してください。
- 結果: 縦に潰れるので、「数学の平均」「英語の平均」「国語の平均」が残ります。
Aさん、Bさん、Cさんの個性が潰されて、科目ごとのデータになるわけです。
(※教科書的に言うと「行をまたいで計算する」となりますが、「縦に潰す」の方が分かりやすいですよね!)
Axis = 1 (横方向 →) の場合
次に、 df.sum(axis=1) を実行してみましょう。
- 矢印のイメージ: 左から右へ(→)矢印が走ります。
- 潰すイメージ: この表を、左右からプレス機で挟んで、一列にまとめてしまうと想像してください。
- 結果: 横に潰れるので、「Aさんの合計点」「Bさんの合計点」「Cさんの合計点」が残ります。
科目ごとの区切りが潰されて、生徒ごとのデータになるわけです。
どうですか?
「Axis=1は列」と暗記していると、「列(科目)ごとの合計が欲しいからAxis=1かな?」と勘違いしてしまいがちです。
でも、「Axis=1は横方向(→)に潰す」と覚えておけば、「横に潰したら個人の合計になっちゃうな。科目を残したいなら縦(↓)に潰すAxis=0だ!」と正しく判断できます。
「削除(drop)」の場合は「沿って探す」
次に、行や列を削除する df.drop() などの操作を見てみましょう。
ここでも矢印のイメージは 「Axis=0は縦↓」「Axis=1は横→」 で変わりません。
ただし、操作のイメージが「潰す」から「その線に沿ってターゲットを探す」に変わります。
Axis = 0 (縦方向 ↓) で削除
df.drop("Bさん", axis=0)
「縦方向(↓)の軸に沿って、"Bさん"というラベルを探して消してね」という意味になります。
縦軸(インデックス)には人の名前が並んでいるので、Bさんの行が消えます。
Axis = 1 (横方向 →) で削除
df.drop("英語", axis=1)
「横方向(→)の軸に沿って、"英語"というラベルを探して消してね」という意味になります。
横軸(カラム名)には科目名が並んでいるので、英語の列が消えます。
覚え方のコツ:プログラミングの「順番」
「そもそも、どっちが縦でどっちが横か忘れちゃうよ!」という方へ。
Python(NumPy)の配列の表記を思い出してください。
行列の形(shape)を確認すると、 (行数, 列数) 、つまり (高さ, 幅) の順で表示されますよね。
- 0番目の要素: 高さ(縦)
- 1番目の要素: 幅(横)
この順番とリンクさせましょう。
「最初は縦(0)、次は横(1)」です。
アルファベットの「H(Height:縦)」と「W(Width:横)」の順だと思ってもいいですし、漢字の「十(縦棒から書く人もいますが、横棒から書きますね……これは忘れましょう)」、「人の体は縦に長い(0)、手を広げると横(1)」など、自分なりのイメージを見つけてみてください。
解説でイメージしていただいた「矢印の向き」と「潰す感覚」を、実際のPythonコードで確認してみましょう。
pandasというライブラリを使って、前回登場した「テストの点数表」を再現します。お手元の環境(Jupyter NotebookやGoogle Colabなど)に貼り付けて実行してみてください。百聞は一見にしかず、ですよ。
1. データの準備
まずは、実験に使うデータフレームを作ります。 3人の生徒(行)と3つの教科(列)のデータです。
import pandas as pd
# テストの点数データを作成
data = {
'数学': [80, 60, 100],
'英語': [90, 50, 100],
'国語': [70, 60, 100]
}
# 行(インデックス)に名前をつける
df = pd.DataFrame(data, index=['Aさん', 'Bさん', 'Cさん'])
print("--- 元のデータ ---")
print(df)
これを実行すると、以下のような表が表示されます。
数学 英語 国語
Aさん 80 90 70 Bさん 60 50 60 Cさん 100 100 100
2. 集計(sum)での違い
では、合計値を計算してみましょう。 「どっち方向に潰すか」を意識してくださいね。
axis=0(縦に潰す)
縦方向(↓)に矢印が走り、ペチャンコにします。 結果として「教科ごとの合計点」が残るはずです。
# axis=0:縦に集計(教科ごとの合計)
print("--- axis=0 の結果(縦:教科ごと) ---")
print(df.sum(axis=0))
実行結果: 数学 240 英語 240 国語 230 dtype: int64
予想通り、Aさんたちの個性が消えて、教科の合計だけが残りましたね。
axis=1(横に潰す)
横方向(→)に矢印が走り、ペチャンコにします。 結果として「生徒ごとの合計点」が残るはずです。
# axis=1:横に集計(生徒ごとの合計)
print("--- axis=1 の結果(横:生徒ごと) ---")
print(df.sum(axis=1))
実行結果: Aさん 240 Bさん 170 Cさん 300 dtype: int64
こちらも予想通り、教科の区切りが消えて、個人の合計点だけが残りました。
3. 削除(drop)での違い
次は、行や列を消す操作です。 「その軸(線)に沿ってターゲットを探す」というイメージでしたね。
axis=0(縦軸に沿って探す)
縦方向(インデックス)にある「Bさん」というラベルを探して消します。
# axis=0:縦軸(インデックス)にある 'Bさん' を探して消す
print("--- axis=0 で Bさんを削除 ---")
print(df.drop('Bさん', axis=0))
実行結果: 数学 英語 国語 Aさん 80 90 70 Cさん 100 100 100
Bさんの行がまるごと消えました。
axis=1(横軸に沿って探す)
横方向(カラム)にある「英語」というラベルを探して消します。
# axis=1:横軸(カラム)にある '英語' を探して消す
print("--- axis=1 で 英語を削除 ---")
print(df.drop('英語', axis=1))
実行結果: 数学 国語 Aさん 80 70 Bさん 60 60 Cさん 100 100
英語の列がまるごと消えました。
まとめ
- Axis=0 : 縦(↓)。集計なら「縦に潰す(科目ごとの平均など)」。
- Axis=1 : 横(→)。集計なら「横に潰す(個人の合計など)」。
- 迷ったら、手を使って空中に矢印を描いてみてください。「潰したら何が残るか?」を想像すれば、もう間違えることはありません。
今後の学習の指針
Axisの感覚は、頭で考えるより実際に動かして失敗することで身につきます。
お手元のPython環境で、あえて axis=0 と axis=1 を逆に指定してみて、「うわっ、意図しない数字が出た!」という経験をしてみてください。
また、もし3次元以上の配列(テンソル)を扱うようになったら、「Axis=2は奥行き方向」というふうに、矢印のイメージを増やしていけば大丈夫です。基本はいつも「0から順に次元が増えていく」だけですからね。
それでは、また次の記事でお会いしましょう。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。