Skip to content

2. Python入門

2.1 変数と基本データ型

Python を含む多くのプログラミング言語において、データは 変数 に格納して扱います。変数とは、さまざまな情報を保存するための入れ物のようなもので、基本的なデータ型に「整数」「浮動小数点数」「文字列」「論理値」があります。

x = 10          # 整数
pi = 3.1415     # 浮動小数点数
name = "Kano"   # 文字列
is_valid = True # 論理値 (True/False)
int x = 10;            // 整数
float pi = 3.1415;     // 浮動小数点数
char name[] = "Kano";  // 文字列
int is_valid = 1;      // 論理値 (1/0)

C 言語との主な違い

  • 型宣言が不要:Python では変数の型を宣言する必要がなく、代入する値から自動的に型が決定されます(動的型付け)
  • セミコロン不要:Python では文末のセミコロン ; が不要です
  • 論理値の表記:C 言語では 1/0 で真偽を表しますが、Python では True/False というキーワードを使います(先頭大文字に注意)

2.1.1 基本的な算術演算子

数値型のデータは、算術演算子を用いて演算を行うことができます。

式 演算子 説明
x + y 加算演算子 x に y を加えた値
x - y 減算演算子 x から y を引いた値
x * y 乗算演算子 x に y を乗じた値
x / y 除算演算子 x を y で割った値
x % y 剰余演算子 x を y で割った余り
x ** y べき乗演算子 x を y 乗した値

C 言語の算術演算との違い

C 言語にはべき乗演算子がありません。べき乗を計算するには pow() 関数を使う必要があります。また、Python の除算 / は常に浮動小数点数を返しますが、C言語では整数同士の割り算は整数除算になります。Python で整数除算を行いたい場合は // 演算子を使用します。

インタラクティブモード(対話モード)

Google Colab では、変数や数式を直接打ち込むだけで結果が表示されます。print() 関数を使わなくても、セルの最後の行に書かれた値が自動的に出力されます。

# print() を使わなくても結果が表示される
2 + 3  # 5 と表示される
# 変数の値も直接表示できる
x = 10
x  # 10 と表示される

複数の値を表示したい場合は、print() 関数を使う必要があります。

演習 2-1: 変数と演算

演習 2-1

  • 円周率を pi = 3.14159 として変数に代入し、半径 r = 5 の円の面積を計算してください
  • 2つの整数 a = 17 と b = 5 について、除算 /、整数除算 //、剰余 % の結果をそれぞれ出力してください
解答例
# 円の面積を計算
pi = 3.14159
r = 5
area = pi * r ** 2
print(f"半径{r}の円の面積: {area}")

# 除算、整数除算、剰余の計算
a = 17
b = 5
print(f"除算 {a} / {b} = {a / b}")
print(f"整数除算 {a} // {b} = {a // b}")
print(f"剰余 {a} % {b} = {a % b}")
半径5の円の面積: 78.53975
除算 17 / 5 = 3.4
整数除算 17 // 5 = 3
剰余 17 % 5 = 2

2.2 リストと辞書

複数のデータを扱いたいときには、「リスト」 (list) や「辞書」 (dict) といったデータ型を使用します。

2.2.1 リスト

リストは、順番のあるデータの集まり です。要素をカンマで区切り、角括弧 [] で作成します。インデックス(何番目の要素かを表す数字)で参照できることと、変更(追加・削除・更新)ができる性質を持ちます。

# リストの作成
fruits = ["apple", "banana", "lemon"]
print(fruits[0])  # 出力: "apple"

# 要素の追加
fruits.append("orange")

# 要素数の取得
print(len(fruits))  # 4
// 配列の作成(サイズ固定)
char *fruits[3] = {"apple", "banana", "lemon"};
printf("%s\n", fruits[0]);  // 出力: "apple"

// 要素数
int length = 3;  // 手動で管理

C 言語の配列との違い

  • C 言語の配列はサイズが固定ですが、Python のリストは動的にサイズを変更できます
  • Python では append() メソッドで簡単に要素を追加できます
  • Python では len() 関数でリストの長さを取得できます

2.2.2 辞書

辞書は、キーと値がペアとなったデータ構造(順序あり) です。キーと値をコロンで区切り、それぞれの組をカンマで区切って波括弧 {} で作成します。キーを用いることで、値を高速に参照することができます。

# 辞書の作成
person = {"name": "Taro", "age": 30}
print(person["name"]) # "Taro"
print(person["age"])  # 30

# 新しいキーと値の追加
person["city"] = "Tokyo"
// C言語には標準で辞書型がありません
// 構造体を使って似たようなデータを扱います
struct Person {
    char name[50];
    int age;
};

struct Person person;
strcpy(person.name, "Taro");
person.age = 30;
printf("%s\n", person.name);  // "Taro"
printf("%d\n", person.age);   // 30

C 言語との違い

C言語には辞書型に相当するデータ構造が標準では用意されていません。構造体を使うか、ハッシュテーブルを自分で実装する必要があります。Pythonでは辞書が標準で用意されており、非常に使いやすくなっています。

2.2.3 タプルと集合

リストと辞書のほかに、「タプル」 (tuple) と「集合」(set) というデータ構造もあります。

タプル は、リストに似ていますが、一度作成すると要素を変更できない(イミュータブル) データ構造です。要素をカンマで区切り、丸括弧 () を使って定義します。

# タプルの作成
dimensions = (1920, 1080)
print(dimensions[0])  # 1920

# タプルのアンパック(複数の変数にまとめて代入)
width, height = dimensions
print(f"Width: {width}, Height: {height}")

画像サイズや座標のように「変更されては困る値の組」を表すときは、リストではなくタプルを使うと安全です。

集合 は、重複のない要素の集まり を扱うデータ構造です。波括弧 {} を使って定義しますが、辞書と異なりキーと値のペアではなく、要素の順序も保証されません。

# 集合の作成
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

print(A | B)  # 和集合: {1, 2, 3, 4, 5, 6}
print(A & B)  # 積集合: {3, 4}

重複を取り除きたいときや、和集合・積集合などの集合演算を行いたいときに便利です。とはいえ、はじめのうちは「リスト」と「辞書」だけ扱うことができれば十分です。

演習 2-2: リストと辞書

演習 2-2

  • リスト fruits = ["りんご", "バナナ", "オレンジ"] を作成し、"ぶどう"を追加、2番目の要素を出力、要素数を出力してください
  • 自分の情報を辞書で作成してください(名前、年齢、出身地など3つ以上)。そして名前を出力してください
解答例
# リストの操作
fruits = ["りんご", "バナナ", "オレンジ"]
print(f"初期リスト: {fruits}")

# "ぶどう"を追加
fruits.append("ぶどう")
print(f"追加後: {fruits}")

# 2番目の要素を出力(インデックスは0から始まるので1)
print(f"2番目の要素: {fruits[1]}")

# 要素数を出力
print(f"要素数: {len(fruits)}")

# 辞書の作成
my_info = {
    "name": "ちくわ",
    "age": 20,
    "city": "水戸",
    "major": "機械システム"
}

# 名前を出力
print(f"名前: {my_info['name']}")
初期リスト: ['りんご', 'バナナ', 'オレンジ']
追加後: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
2番目の要素: バナナ
要素数: 4
名前: ちくわ

2.3 条件分岐(if 文)

if 文は、条件に応じて処理を分岐させることができる構文です。複数の分岐を作りたい場合は、elif や else を使用します。

score = 85
if score >= 90:
    print("Excellent")
elif score >= 80:
    print("Good")
else:
    print("Bad")
int score = 85;
if (score >= 90) {
    printf("Excellent\n");
} else if (score >= 80) {
    printf("Good\n");
} else {
    printf("Bad\n");
}

C 言語との違い

  • インデント(字下げ)が必須:Pythonでは {} の代わりにインデントでブロックを表します。インデントを揃えないと構文エラーになります
  • 条件式に括弧が不要:Pythonでは if の条件式を () で囲む必要がありません
  • elif キーワード:C言語の else if は、Pythonでは elif と書きます
  • コロン : が必要:if、elif、else の後には必ずコロン : を付けます

2.3.1 比較演算子

式 説明
x < y x が y より小さいと True、そうでないと False
x > y x が y より大きいと True、そうでないと False
x <= y x が y 以下であれば True、そうでないと False
x >= y x が y 以上であれば True、そうでないと False
x == y x が y と等しいと True、そうでないと False
x != y x が y と等しくないと True、そうでないと False

2.3.2 論理演算子

式 説明
X and Y X と Y がいずれも True であれば True
X or Y X と Y のいずれかが True であれば True
not X X が True であれば False、False であれば True

C 言語との違い

C言語では論理演算子として &&(AND)、||(OR)、!(NOT)を使いますが、Pythonでは and、or、not という英単語を使います。

演習 2-3: 条件分岐

演習 2-3

変数 temperature に気温を、humidity に湿度を代入し、気温が20度以上30度未満、かつ湿度が70%未満のときに "快適" と出力してください。それ以外のときは、適切な文字列を出力してください

解答例
# 気温と湿度の設定(いろいろな値で試してみてください)
temperature = 25
humidity = 60

if temperature >= 20 and temperature < 30 and humidity < 70:
    print("快適")
elif temperature < 20:
    print("寒いです")
elif temperature >= 30:
    print("暑いです")
else:
    print("湿度が高いです")
快適

2.4 繰り返し処理(for 文、while 文)

同じ処理を複数回行うときには、for 文や while 文を使います。

2.4.1 for 文

for 文は、リストの中身を 1 つずつ処理する際に、if 文と組み合わせてよく使用されます。

# リストの中身を 1 つずつ処理する例
for n in [1, 2, 3, 4, 5]:
    print(n)

# 数値の範囲を range で指定する例
for i in range(30):
    if i % 3 == 0:
        print(f"{i}!")
    else:
        print(i)
// 配列の中身を 1 つずつ処理する例
int numbers[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    printf("%d\n", numbers[i]);
}

// 数値の範囲でループする例
for (int i = 0; i < 30; i++) {
    if (i % 3 == 0) {
        printf("%d!\n", i);
    } else {
        printf("%d\n", i);
    }
}

C 言語との違い

  • for文の書き方が異なる:Pythonでは for 変数 in リスト: という形式で、直接要素を取り出せます。C言語では for (初期化; 条件; 更新) という形式でインデックスを使います
  • range クラス:Pythonの range(30) は 0 から 29 までの数値を生成します。C言語では for (int i = 0; i < 30; i++) と書く必要があります
  • f-string:Pythonの f"{変数}" は文字列内に変数を埋め込む便利な記法です(C言語の printf のフォーマット指定子に相当)

2.4.2 while 文

while 文は、特定の条件を満たす間、同じ処理を繰り返したいときに使用されます。 途中でループを抜け出したいときには break 文、ループの判定に戻りたいときは continue 文を使います。

# n (>2) が素数かどうかを判定するプログラム
n = 23
i = 2
while i < n:
    if n % i == 0:
        print(f"{n} は素数ではない")
        break
    i = i + 1
if i == n:
    print(f"{n} は素数")
// n (>2) が素数かどうかを判定するプログラム
int n = 23;
int i = 2;
while (i < n) {
    if (n % i == 0) {
        printf("%d は素数ではない\n", n);
        break;
    }
    i = i + 1;
}
if (i == n) {
    printf("%d は素数\n", n);
}

C 言語との違い

  • 条件式の括弧:C言語では while (条件) と括弧が必要ですが、Pythonでは while 条件: と括弧なしで書けます
  • break と continue:これらはC言語と同じように使えます

Warning

条件を間違えて無限ループに陥るとプログラムが固まってしまうので注意してください。

演習 2-4: 繰り返し処理

演習 2-4

  • for 文を使って、1から10までの整数の合計を計算してください
  • リスト numbers = [12, 7, 23, 8, 15, 4, 19] の中から、10以上の数だけを出力してください
  • while 文を使って、1から始め、1000以下の間は値を表示して2倍するプログラム(1000を超える値は表示せず、最後の出力は512)を作成してください
解答例
# 1. 1から10までの合計を計算
total = 0
for i in range(1, 11):  # 1から10まで(11は含まない)
    total += i
print(f"1から10までの合計: {total}")

# 2. 10以上の数だけを出力
numbers = [12, 7, 23, 8, 15, 4, 19]
print("10以上の数:")
for num in numbers:
    if num >= 10:
        print(num)

# 3. 1000以下の値だけを表示し、2倍ずつ増やす
value = 1
print("2倍ずつ増やす:")
while value <= 1000:
    print(value)
    value *= 2
1から10までの合計: 55
10以上の数:
12
23
15
19
2倍ずつ増やす:
1
2
4
8
16
32
64
128
256
512

2.5 関数

何度も使う可能性のある一連の処理は、関数 にまとめることで、プログラムをスッキリ整理することができます。関数は def 関数名(引数): といった形で定義し、return で結果を返します。慣れないうちは、無理に関数を使わなくても全く問題ありません。慣れてきたら、より洗練されたプログラムにするために、関数を使うことを検討してください。

# 足し算を行う関数
def add(a, b):
    return a + b
print(add(3, 5)) # 8

# 3 の倍数かどうかを判定する関数
def is_3x(n):
    return n % 3 == 0
print(is_3x(42)) # True

# リストの平均値を計算する関数
# 要素の合計(sum())を要素数(len())で割る
def calc_average(numbers):
    return sum(numbers) / len(numbers)
print(calc_average([10, 20, 30, 40])) # 25.0
// 足し算を行う関数
int add(int a, int b) {
    return a + b;
}
printf("%d\n", add(3, 5)); // 8

// 3 の倍数かどうかを判定する関数
int is_3x(int n) {
    return n % 3 == 0;
}
printf("%d\n", is_3x(42)); // 1 (True)

// 配列の平均値を計算する関数
float calc_average(int numbers[], int length) {
    int sum = 0;
    for (int i = 0; i < length; i++) {
        sum += numbers[i];
    }
    return (float)sum / length;
}
int nums[] = {10, 20, 30, 40};
printf("%.1f\n", calc_average(nums, 4)); // 25.0

C 言語との違い

  • 戻り値と引数の型宣言が不要:Pythonでは関数定義時に型を宣言する必要がありません
  • def キーワード:Pythonでは def で関数を定義します(C言語は戻り値の型から始まる)
  • コロン : とインデント:Python では関数定義の後にコロンを付け、関数本体をインデントで表します
  • 配列の長さ:Pythonのリストは長さの情報を持っているため、引数として長さを渡す必要がありません

より包括的な概念として クラス がありますが、これもはじめのうちは意識しなくて問題ありません。

演習 2-5: 関数

演習 2-5

  • 2つの数の最大値を返す関数 max_value(a, b) を作成してください
  • リストを引数として受け取り、リスト内の偶数の個数を返す関数 count_even(numbers) を作成してください
  • 非負整数 n を引数として受け取り、n の階乗(0! = 1)を計算する関数 factorial(n) を作成してください
解答例
# 1. 最大値を返す関数
def max_value(a, b):
    if a > b:
        return a
    else:
        return b

print(max_value(10, 25))
print(max_value(100, 50))

# 2. 偶数の個数を数える関数
def count_even(numbers):
    count = 0
    for num in numbers:
        if num % 2 == 0:
            count += 1
    return count

test_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(f"偶数の個数: {count_even(test_numbers)}")

# 3. 階乗を計算する関数
def factorial(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

print(f"5の階乗: {factorial(5)}")
print(f"10の階乗: {factorial(10)}")
25
100
偶数の個数: 5
5の階乗: 120
10の階乗: 3628800

2.6 ライブラリの使い方(NumPy、pandas)

Python では多くの便利な機能が「ライブラリ」として提供されています。指す対象の広さに応じて「パッケージ」「モジュール」とも呼ばれますが、便利なツール群ということで言葉の違いはあまり気にしなくても問題ありません。いずれも import 文で使います。

import numpy as np # 数値計算ライブラリ
import pandas as pd # データ処理ライブラリ
import matplotlib.pyplot as plt # 可視化モジュール

# ライブラリの使用例
arr = np.array([1, 2, 3, 4, 5])
print(arr.mean())  # 平均値を計算
#include <stdio.h>  // 標準入出力ライブラリ
#include <math.h>   // 数学関数ライブラリ
#include <string.h> // 文字列処理ライブラリ

// ライブラリの使用例
double result = sqrt(16.0);  // 平方根を計算
printf("%.1f\n", result);

C 言語との違い

  • import vs #include:Pythonでは import、C言語では #include でライブラリを読み込みます
  • エイリアス:Pythonでは import ... as ... で長い名前を短縮できます。C言語にはこの機能はありません
  • 豊富なライブラリ:Pythonは標準で豊富なライブラリが用意されており、データ分析や機械学習に特化したライブラリも簡単に利用できます

この例のように、import ... as ... とすることで、長いライブラリ名やモジュール名を省略することができます。as を使わずに使用することもできますが、matplotlib.pyplot なんて毎回書いていられないので、plt にして簡潔にしているというわけです。

ここで挙げた numpy、pandas、matplotlib は、数値計算、表形式データの処理、可視化をそれぞれ担当します。以降の章でも、この3つを組み合わせてデータを確認・加工します。

2.6.1 pandas とは

pandas は、Python でデータ分析を行うための最重要ライブラリの一つです。表形式のデータを扱うのに特化しており、Excel や CSV ファイルのようなデータを簡単に操作できます。

pandas の名前の由来

pandas という名前は、「Panel Data(パネルデータ)」と「Python Data Analysis(Pythonデータ分析)」に由来しています。

pandas の主な特徴

  • 表形式データ(テーブルデータ)を扱いやすい
  • CSV、Excel、SQL データベースなど、さまざまなデータ形式の読み込み・書き出しが簡単
  • 欠損値の処理が容易
  • データの集計、グループ化、結合などの操作が直感的
  • NumPy や Matplotlib、scikit-learn との連携がスムーズ
graph LR
    A("データソース") --> B("pandas")
    B --> C("データの読み込み")
    B --> D("データの加工")
    B --> E("データの分析")
    B --> F("データの可視化")

    C --> G("CSV, Excel, SQL...")
    D --> H("欠損値処理<br/>データ変換<br/>特徴量作成")
    E --> I("統計量計算<br/>グループ化<br/>集計")
    F --> J("matplotlib<br/>seaborn")

    classDef data fill:#D9EAF3,stroke:#0072B2,stroke-width:2px,color:#000
    classDef proc fill:#D9F0EA,stroke:#009E73,stroke-width:2px,color:#000
    classDef model fill:#F7EBF2,stroke:#CC79A7,stroke-width:2px,color:#000
    classDef out fill:#F5ECE2,stroke:#BF8040,stroke-width:2px,color:#000
    classDef neu fill:#F2F2F2,stroke:#8C8C8C,stroke-width:2px,color:#000
    class A,C,G data
    class D,H proc
    class E,I model
    class F,J out
    class B neu

2.6.2 pandas のインポート

pandas は通常、pd という略称でインポートします。これは慣習的な書き方で、ほとんどのコードで使われています。

import pandas as pd
import numpy as np

2.6.3 主要なデータ構造

pandas には 2 つの主要なデータ構造があります。

Series(シリーズ)

Series は、1 次元のデータ構造です。NumPy の配列に「インデックス(ラベル)」が付いたものと考えることができます。

Series を作成するためには、pandas.Series クラスを使用します。

リストから Series を作成
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50])
print(s)
Output
0    10
1    20
2    30
3    40
4    50
dtype: int64
インデックスを指定して作成
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print(s)
Output
a    10
b    20
c    30
d    40
e    50
dtype: int64
値へのアクセス
print(s['c'])  # 30
print(s.iloc[2])    # 30(位置でもアクセス可能)

DataFrame(データフレーム)

DataFrame は、2 次元のデータ構造(表形式データ)です。Excel のスプレッドシートや SQL のテーブルのようなものと考えることができます。

DataFrame を作成するためには、pandas.DataFrame クラスを使用します。

辞書から DataFrame を作成
import pandas as pd

df = pd.DataFrame({
    'name': ['太郎', '花子', '次郎', '梅子'],
    'age': [25, 30, 35, 28],
    'city': ['茨城', '大阪', '京都', '東京']
})
print(df)
Output
  name  age city
0   太郎   25   茨城
1   花子   30   大阪
2   次郎   35   京都
3   梅子   28   東京
列へのアクセス(Series として取得)
print(df['name'])
Output
0    太郎
1    花子
2    次郎
3    梅子
Name: name, dtype: object
行へのアクセス
print(df.loc[0])     # インデックスで指定
Output
name    太郎
age     25
city    茨城
Name: 0, dtype: object
graph TB
    A("pandas のデータ構造") --> B("Series<br/>1次元")
    A --> C("DataFrame<br/>2次元")

    B --> B1("インデックス付き配列<br/>例: 時系列データ")
    C --> C1("表形式データ<br/>例: CSVファイル、Excelシート")

    C --> D("複数のSeriesが<br/>集まったもの")

    classDef data fill:#D9EAF3,stroke:#0072B2,stroke-width:2px,color:#000
    classDef proc fill:#D9F0EA,stroke:#009E73,stroke-width:2px,color:#000
    classDef neu fill:#F2F2F2,stroke:#8C8C8C,stroke-width:2px,color:#000
    class A neu
    class B,B1 data
    class C,C1,D proc

2.6.4 DataFrame の基本操作

データの確認

データの先頭を確認するためには、.head() メソッドを使用します。同様に、末尾を確認するには .tail() メソッドを使用します。

データの概要を確認するには、.info() メソッドや .describe() メソッドを使用します。

import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(42)
df = pd.DataFrame({
    'A': np.random.randint(1, 100, 10),
    'B': np.random.randint(1, 100, 10),
    'C': np.random.randint(1, 100, 10)
})

# 先頭5行を表示
print(df.head())

# 末尾5行を表示
print(df.tail())

# データの形状(行数、列数)
print(f"形状: {df.shape}")  # (10, 3)

# データの情報
df.info()

# 統計情報
print(df.describe())

列の選択

import pandas as pd

df = pd.DataFrame({
    'name': ['太郎', '花子', '次郎'],
    'age': [25, 30, 35],
    'salary': [400, 500, 600]
})

# 1つの列を選択(Series として返る)
print(df['name'])

# 複数の列を選択(DataFrame として返る)
print(df[['name', 'age']])

# 新しい列を追加
df['bonus'] = df['salary'] * 0.1
print(df)

行の選択とフィルタリング

行を選択するためには、.loc[](ラベルベース)や .iloc[](位置ベース)を使用します。

import pandas as pd

df = pd.DataFrame({
    'name': ['太郎', '花子', '次郎', '梅子'],
    'age': [25, 30, 35, 28],
    'salary': [400, 500, 600, 450]
})

# 条件でフィルタリング
print(df[df['age'] >= 30])

# 複数条件
print(df[(df['age'] >= 30) & (df['salary'] >= 500)])

# loc: ラベルベースの選択
print(df.loc[0:2, ['name', 'age']])

# iloc: 位置ベースの選択
print(df.iloc[0:2, 0:2])

基本的な統計量

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
})

# 各列の平均
print("平均:")
print(df.mean())

# 各列の合計
print("\n合計:")
print(df.sum())

# 各列の最大値・最小値
print("\n最大値:")
print(df.max())

print("\n最小値:")
print(df.min())

# 特定の列の統計量
print(f"\nAの平均: {df['A'].mean()}")
print(f"Bの標準偏差: {df['B'].std()}")

2.6.5 欠損値の処理

実際のデータには欠損値(NaN: Not a Number)が含まれることがよくあります。pandas では欠損値の処理を簡単に行うことができます。

欠損値を確認するためには、.isnull() メソッドを使用します。欠損値を削除するには .dropna() メソッド、欠損値を埋めるには .fillna() メソッドを使用します。

import pandas as pd
import numpy as np

# 欠損値を含むデータ
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [10, np.nan, 30, 40, 50],
    'C': [100, 200, 300, np.nan, 500]
})

print("元のデータ")
print(df)

# 欠損値の確認
print("\n欠損値の有無")
print(df.isnull())

print("\n各列の欠損値の数")
print(df.isnull().sum())

# 欠損値を含む行を削除
print("\n欠損値を含む行を削除")
print(df.dropna())

# 欠損値を特定の値で埋める
print("\n欠損値を0で埋める")
print(df.fillna(0))

# 欠損値を平均値で埋める
print("\n欠損値を平均値で埋める")
print(df.fillna(df.mean()))
Output
元のデータ
     A     B      C
0  1.0  10.0  100.0
1  2.0   NaN  200.0
2  NaN  30.0  300.0
3  4.0  40.0    NaN
4  5.0  50.0  500.0

欠損値の有無
       A      B      C
0  False  False  False
1  False   True  False
2   True  False  False
3  False  False   True
4  False  False  False

各列の欠損値の数
A    1
B    1
C    1
dtype: int64

欠損値を含む行を削除
     A     B      C
0  1.0  10.0  100.0
4  5.0  50.0  500.0

欠損値を0で埋める
     A     B      C
0  1.0  10.0  100.0
1  2.0   0.0  200.0
2  0.0  30.0  300.0
3  4.0  40.0    0.0
4  5.0  50.0  500.0

欠損値を平均値で埋める
     A     B      C
0  1.0  10.0  100.0
1  2.0  32.5  200.0
2  3.0  30.0  300.0
3  4.0  40.0  275.0
4  5.0  50.0  500.0

2.6.6 CSV ファイルの読み込み

pandas の最も強力な機能の一つは、さまざまな形式のファイルを簡単に読み書きできることです。

CSV ファイルを読み込むためには、pandas.read_csv() 関数を使用します。Excel ファイルを読み込むには、pandas.read_excel() 関数を使用します。

import pandas as pd

# CSV ファイルの読み込み
df = pd.read_csv('data.csv')

# ヘッダーがない場合
df = pd.read_csv('data.csv', header=None)

# 列名を指定
df = pd.read_csv('data.csv', names=['col1', 'col2', 'col3'])

# 特定の列のみ読み込む
df = pd.read_csv('data.csv', usecols=['col1', 'col2'])

# Excel ファイルの読み込み
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

2.6.7 pandas と NumPy の相互変換

pandas と NumPy は相互に変換できます。

DataFrame を NumPy 配列に変換するためには、.values 属性または .to_numpy() メソッドを使用します。

import pandas as pd
import numpy as np

# DataFrame から NumPy 配列へ
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})
arr = df.values  # または df.to_numpy()
print("DataFrame → NumPy 配列")
print(type(arr))
print(arr)

# NumPy 配列から DataFrame へ
arr = np.array([[1, 2, 3], [4, 5, 6]])
df = pd.DataFrame(arr, columns=['A', 'B', 'C'])
print("\nNumPy 配列 → DataFrame")
print(type(df))
print(df)
Output
DataFrame → NumPy 配列
<class 'numpy.ndarray'>
[[1 4]
 [2 5]
 [3 6]]

NumPy 配列 → DataFrame
<class 'pandas.core.frame.DataFrame'>
   A  B  C
0  1  2  3
1  4  5  6

pandas と NumPy の使い分け

NumPy を使うべき場合

  • 純粋な数値計算が中心(行列演算、数学関数など)
  • 大規模な数値配列の高速処理が必要
  • メモリ効率を重視する場合
  • 例:画像処理、科学技術計算、線形代数

pandas を使うべき場合

  • 列に意味のある名前を付けたい(可読性向上)
  • CSV や Excel からデータを読み込む
  • 欠損値を含むデータを扱う
  • データの集計・グループ化・結合が必要
  • データの探索的分析(EDA)を行う
  • 例:ビジネスデータ分析、統計分析、機械学習の前処理

実務でのワークフロー

  1. データ読み込み・前処理: pandas
  2. 機械学習モデルの学習: pandas または NumPy(どちらも可)
  3. 高度な数値計算: NumPy

pandas と NumPy は相互に変換可能なので、状況に応じて使い分けられます。

2.7 発展: モジュール・例外処理・ファイル入出力

ここでは、この先の章でコードを読み書きする際に知っておくと役立つトピックを、要点だけ紹介します。最初から完璧に覚える必要はなく、「こういう仕組みがある」と知っておくだけで十分です。

2.7.1 モジュールと標準ライブラリ

モジュール とは、Python のコードをまとめたファイルのことです。import 文には主に 3 つの書き方があります。

# 1. モジュールをそのまま読み込む
import math
print(math.sqrt(25))  # 5.0

# 2. 別名(エイリアス)を付けて読み込む
import numpy as np
print(np.sqrt(25))  # 5.0

# 3. モジュールから特定の関数やクラスだけを読み込む
from datetime import datetime
print(datetime.now())  # 現在の日時

Python には、インストール不要ですぐに使える 標準ライブラリ が豊富に用意されています。代表的なものをいくつか紹介します。

import random

# 1から100までのランダムな整数を生成
print(random.randint(1, 100))

# リストからランダムに選択
print(random.choice(["リンゴ", "バナナ", "オレンジ"]))
from datetime import datetime

# 現在の日付と時刻を取得
now = datetime.now()
print(now.strftime("%Y-%m-%d"))

標準ライブラリと外部ライブラリ

math、random、datetime、os などは標準ライブラリで、そのまま import できます。一方、NumPy や pandas は外部ライブラリで、通常は pip install でのインストールが必要です(Google Colab にはあらかじめインストールされています)。

2.7.2 例外処理

プログラムの実行中に発生する予期しないエラーを 例外 と呼びます。try-except 文を使うと、例外が発生してもプログラムを停止させずに、適切な処理を行うことができます。

try:
    result = 10 / 0  # 例外が発生する可能性があるコード
except ZeroDivisionError as e:
    print(f"エラーが発生しました: {e}")
    # 出力: エラーが発生しました: division by zero

try ブロック内で例外が発生すると、except ブロックに処理が移ります。

機械学習では、データファイルの読み込み時に ファイルが見つからない エラー(FileNotFoundError クラス)がよく発生します。

import pandas as pd

try:
    df = pd.read_csv("data.csv")
except FileNotFoundError:
    print("エラー: data.csv が見つかりません。ファイル名やパスを確認してください")

Note

Google Colab でエラーメッセージが表示されたときは、最後の行に例外の種類(FileNotFoundError クラスや ValueError クラスなど)と原因が表示されます。まずここを読む習慣をつけると、エラー解決が格段に早くなります。

2.7.3 ファイル入出力

ファイルの読み書きには open() 関数を使います。with 文と組み合わせることで、処理が終わったあとにファイルが自動的に閉じられるため、この書き方が推奨されています。

# ファイルへの書き込み('w': 書き込みモード)
with open("example.txt", "w") as f:
    f.write("Hello, Python!")

# ファイルの読み込み('r': 読み取りモード)
with open("example.txt", "r") as f:
    content = f.read()
    print(content)  # Hello, Python!

モードには、読み取りの 'r'、書き込み(上書き)の 'w'、追記の 'a' などがあります。

なお、2.6.6 で紹介した pd.read_csv() 関数は、このようなファイル読み込みと CSV の解析を pandas がまとめて行ってくれる関数であり、機械学習で表形式データを扱う場合は通常こちらを使います。

2.8 演習問題

演習 2-6: 倍数チェッカー

演習 2-6

1~50 までの数を順番に表示し、3 の倍数のときは数字の後ろに「!」、5 の倍数のときは数字の後ろに「?」、両方の倍数なら数字の後ろに「!?」をつけるプログラムを作成してください。

解答例
for i in range(1, 51):  # 1から50まで
    if i % 3 == 0 and i % 5 == 0:
        print(f"{i}!?")
    elif i % 3 == 0:
        print(f"{i}!")
    elif i % 5 == 0:
        print(f"{i}?")
    else:
        print(i)

出力(最初の 20 行):

1
2
3!
4
5?
6!
7
8
9!
10?
11
12!
13
14
15!?
16
17
18!
19
20?

別解 1:3 と 5 の両方の倍数は 15 の倍数なので、次のようにも書けます。

for i in range(1, 51):
    if i % 15 == 0:  # 3と5の最小公倍数
        print(f"{i}!?")
    elif i % 3 == 0:
        print(f"{i}!")
    elif i % 5 == 0:
        print(f"{i}?")
    else:
        print(i)

別解 2:数字の後ろに記号を付け足していく方法もあります。条件の順序を気にする必要がなく、倍数の種類が増えても if を 1 つ追加するだけで対応できます。

for i in range(1, 51):
    output = str(i)
    if i % 3 == 0:
        output += "!"
    if i % 5 == 0:
        output += "?"
    print(output)

発展課題: 数当てゲーム

発展課題

1から100までのランダムな整数を生成し、ユーザーに数を当ててもらうゲームを作成してください。

要件:

  • import random を使い、random.randint(1, 100) でランダムな数を生成
  • ユーザーの入力は input() 関数で受け取る(int(input("数字を入力: ")) のように使う)
  • ユーザーの予想が正解より大きければ "もっと小さい数です" と表示
  • ユーザーの予想が正解より小さければ "もっと大きい数です" と表示
  • 正解したら "正解です!◯回で当たりました!" と表示してゲーム終了

ヒント: while 文で繰り返し、if 文で条件分岐、変数で試行回数をカウントします。

解答例
import random

# 1から100までのランダムな整数を生成
answer = random.randint(1, 100)
attempts = 0

print("数当てゲーム")
print("1から100までの数を当ててください!")

while True:
    # ユーザーからの入力を受け取る
    try:
        guess = int(input("数字を入力: "))
        attempts += 1

        # 予想と正解を比較
        if guess < answer:
            print("もっと大きい数です")
        elif guess > answer:
            print("もっと小さい数です")
        else:
            print(f"正解です!{attempts}回で当たりました!")
            break

    except ValueError:
        print("エラー: 整数を入力してください")

# ゲーム終了後のメッセージ
if attempts <= 5:
    print("素晴らしい!")
elif attempts <= 10:
    print("まぁまぁの結果です!")
else:
    print("もう少し頑張りましょう!")

実行例(正解が 34 の場合):

数当てゲーム
1から100までの数を当ててください!
数字を入力: 50
もっと小さい数です
数字を入力: 25
もっと大きい数です
数字を入力: 37
もっと小さい数です
数字を入力: 31
もっと大きい数です
数字を入力: 34
正解です!5回で当たりました!
素晴らしい!