Step 24:データを抽出しよう(基礎編)

🎯 ステップ24: データを抽出しよう(基礎編)

必要なデータだけを取り出す技術をマスターしよう!

ステップ23では、DataFrameの中身を確認する方法を学びました。今回は、DataFrameから必要なデータだけを取り出す方法を学びます。データ分析では、全てのデータを使うのではなく、「特定の列だけ」「特定の行だけ」「条件に合うデータだけ」を抽出して分析することがほとんどです。

📖 このステップで学ぶこと

・列の選択(1列・複数列)

・行の選択(iloc:位置指定)

・行の選択(loc:ラベル指定)

・条件抽出(単一条件・複数条件)

・文字列を含む条件抽出

学習時間の目安: 3〜3.5時間

🎯 1. 列の選択

DataFrameには複数の列がありますが、分析に必要な列だけを取り出すことができます。例えば、顧客データから「名前」と「購入金額」だけを取り出したい場合などに使います。

🔰 1列を選択する方法

1つの列を選択するには、DataFrameの後ろに[‘列名’]を書きます。結果はSeries(1次元のデータ)になります。

📝 1列を選択する書き方

df[‘列名’] → 指定した列を取り出す(推奨)

df.列名 → ドット記法(シンプルだが制限あり)

・dfはDataFrameの変数名です

・列名は文字列なので、シングルクォート(’)またはダブルクォート(”)で囲みます

・ドット記法は、列名にスペースや特殊文字がある場合は使えません

コード:1列を選択する

# Pandasをインポート
import pandas as pd

# サンプルデータを作成
data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26],
    '都市': ['東京', '大阪', '名古屋', '福岡', '札幌']
}

# DataFrameを作成
df = pd.DataFrame(data)

# 元のDataFrameを表示
print("DataFrame:")
print(df)

print()

# 1列を選択(ブラケット記法)
print("年齢列を選択:")
print(df['年齢'])

print()

# 1列を選択(ドット記法)
print("名前列を選択(ドット記法):")
print(df.名前)

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  年齢   都市
0  太郎  25   東京
1  花子  23   大阪
2  次郎  27  名古屋
3  美咲  24   福岡
4  健太  26   札幌

年齢列を選択:
0    25
1    23
2    27
3    24
4    26
Name: 年齢, dtype: int64

名前列を選択(ドット記法):
0    太郎
1    花子
2    次郎
3    美咲
4    健太
Name: 名前, dtype: object

💡 コードの解説

df[‘年齢’]

 ・dfから「年齢」列だけを取り出します

 ・結果はSeries(1次元のデータ)になります

 ・左端の0, 1, 2, 3, 4はインデックス(行番号)です

df.名前

 ・ドット記法で「名前」列を取り出します

 ・df[‘名前’]と同じ結果が得られます

Name: 年齢, dtype: int64の意味:

 ・Name: 列名を示します

 ・dtype: データ型を示します(int64は整数)

📌 2つの書き方の比較

書き方 特徴 おすすめ度
df[‘列名’] どんな列名でも使える(スペースや特殊文字OK) ⭐⭐⭐ 推奨
df.列名 シンプルだが、列名にスペースや特殊文字があると使えない ⭐ 限定的

📝 複数の列を選択する方法

複数の列を選択するには、列名をリストで指定します。結果はDataFrame(2次元のデータ)になります。

📝 複数列を選択する書き方

df[[‘列名1’, ‘列名2’, ‘列名3’]]

・列名をリスト([ ])で囲みます

・カッコが二重になることに注意してください

・外側の[ ]:DataFrameへのアクセス

・内側の[ ]:列名のリスト

コード:複数列を選択する

import pandas as pd

# 商品データを作成
data = {
    '商品名': ['商品A', '商品B', '商品C', '商品D'],
    '価格': [1000, 1500, 2000, 1200],
    '在庫': [50, 80, 60, 30],
    'カテゴリ': ['電化製品', '食品', '電化製品', '衣類']
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print()

# 複数列を選択(リストで指定)
print("商品名と価格のみ:")
print(df[['商品名', '価格']])

print()

# 列の順番も変えられる
print("価格と商品名(順番を変更):")
print(df[['価格', '商品名']])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

元のDataFrame:
   商品名    価格  在庫  カテゴリ
0  商品A  1000  50  電化製品
1  商品B  1500  80    食品
2  商品C  2000  60  電化製品
3  商品D  1200  30    衣類

商品名と価格のみ:
   商品名    価格
0  商品A  1000
1  商品B  1500
2  商品C  2000
3  商品D  1200

価格と商品名(順番を変更):
     価格  商品名
0  1000  商品A
1  1500  商品B
2  2000  商品C
3  1200  商品D

💡 コードの解説

df[[‘商品名’, ‘価格’]]

 ・「商品名」と「価格」の2列を選択します

 ・結果はDataFrame(2次元)になります

df[[‘価格’, ‘商品名’]]

 ・列の順番を変えて選択できます

 ・リストに書いた順番で列が並びます

⚠️ よくある間違い

複数列を選択する時は二重のカッコが必要です!

✅ 正しい書き方:df[['列1', '列2']]

❌ 間違い:df['列1', '列2'] → エラーになります

カッコが二重になる理由:

 ・外側の[ ]:dfから取り出すための記号

 ・内側の[ ]:複数の列名をまとめるリスト

🔢 2. 行の選択 – iloc(位置指定)

DataFrameの行を選択する方法は2つあります。まずiloc(アイロック)を学びます。ilocは行番号(0から始まる位置)でデータを選択します。

🔰 ilocとは?

ilocは「integer location」の略で、整数(数字)で位置を指定してデータを選択します。Pythonでは番号は0から始まるので、1行目はiloc[0]、2行目はiloc[1]になります。

📝 ilocの書き方

df.iloc[行番号] → 1行を選択

df.iloc[開始:終了] → 範囲で選択(終了は含まない)

df.iloc[[番号1, 番号2]] → 飛び飛びで選択

df.iloc[行, 列] → 行と列を同時に指定

・番号は0から始まります(0が1行目)

・負の数も使えます(-1は最後の行)

コード:ilocで1行を選択

import pandas as pd

# サンプルデータを作成
data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26],
    '都市': ['東京', '大阪', '名古屋', '福岡', '札幌']
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 1行目(インデックス0)を選択
print("1行目(iloc[0]):")
print(df.iloc[0])

print()

# 3行目(インデックス2)を選択
print("3行目(iloc[2]):")
print(df.iloc[2])

print()

# 最後の行(インデックス-1)を選択
print("最後の行(iloc[-1]):")
print(df.iloc[-1])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  年齢   都市
0  太郎  25   東京
1  花子  23   大阪
2  次郎  27  名古屋
3  美咲  24   福岡
4  健太  26   札幌

1行目(iloc[0]):
名前    太郎
年齢    25
都市    東京
Name: 0, dtype: object

3行目(iloc[2]):
名前     次郎
年齢     27
都市    名古屋
Name: 2, dtype: object

最後の行(iloc[-1]):
名前    健太
年齢    26
都市    札幌
Name: 4, dtype: object

💡 コードの解説

df.iloc[0]

 ・0番目の行(1行目)を取得します

 ・結果はSeries形式で、列名がインデックスになります

df.iloc[2]

 ・2番目の行(3行目)を取得します

 ・0, 1, 2と数えるので、2は3行目です

df.iloc[-1]

 ・最後の行を取得します

 ・-1は「後ろから1番目」という意味です

 ・-2なら「後ろから2番目」になります

📝 複数の行を選択(範囲指定)

コード:ilocで複数行を選択

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 最初の3行(0〜2番目)
print("最初の3行(iloc[0:3]):")
print(df.iloc[0:3])

print()

# 2行目から4行目(1〜3番目)
print("2行目から4行目(iloc[1:4]):")
print(df.iloc[1:4])

print()

# 飛び飛びで選択(1行目、3行目、5行目)
print("1行目、3行目、5行目:")
print(df.iloc[[0, 2, 4]])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  年齢
0  太郎  25
1  花子  23
2  次郎  27
3  美咲  24
4  健太  26

最初の3行(iloc[0:3]):
   名前  年齢
0  太郎  25
1  花子  23
2  次郎  27

2行目から4行目(iloc[1:4]):
   名前  年齢
1  花子  23
2  次郎  27
3  美咲  24

1行目、3行目、5行目:
   名前  年齢
0  太郎  25
2  次郎  27
4  健太  26

💡 範囲指定のルール

iloc[開始:終了]のルール:

 ・開始は含まれる

 ・終了は含まれない

例:iloc[0:3]

 ・0番目、1番目、2番目が選ばれる

 ・3番目は含まれない

覚え方:「開始から終了の手前まで」

📘 行と列を同時に選択

ilocでは、行と列を同時に指定することもできます。カンマで区切って、最初に行、次に列を指定します。

📝 行と列を同時に選択する書き方

df.iloc[行, 列] → 1つのセルを取得

df.iloc[行範囲, 列範囲] → 範囲で取得

df.iloc[:, 列] → 全行の特定列(:は「全て」の意味)

コード:行と列を同時に選択

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎'],
    '数学': [85, 92, 78],
    '英語': [90, 88, 82],
    '国語': [78, 85, 88]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 2行目の3列目(花子の英語)
print("2行目の3列目(iloc[1, 2]):")
print(df.iloc[1, 2])

print()

# 1〜2行目、2〜3列目
print("1〜2行目、2〜3列目:")
print(df.iloc[0:2, 1:3])

print()

# 全行の2列目(数学)
print("全行の2列目(数学):")
print(df.iloc[:, 1])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  数学  英語  国語
0  太郎  85  90  78
1  花子  92  88  85
2  次郎  78  82  88

2行目の3列目(iloc[1, 2]):
88

1〜2行目、2〜3列目:
   数学  英語
0  85  90
1  92  88

全行の2列目(数学):
0    85
1    92
2    78
Name: 数学, dtype: int64

💡 コードの解説

df.iloc[1, 2]

 ・1行目(花子)、2列目(英語)のセルを取得

 ・結果は88という単一の値になります

df.iloc[0:2, 1:3]

 ・0〜1行目(太郎と花子)、1〜2列目(数学と英語)

 ・結果は2×2のDataFrameになります

df.iloc[:, 1]

 ・「:」は「全て」という意味

 ・全行の1列目(数学)を取得

🏷️ 3. 行の選択 – loc(ラベル指定)

loc(ロック)は、インデックスのラベル名でデータを選択します。ilocが「位置(番号)」で指定するのに対し、locは「名前」で指定します。

🔰 locとは?

locは「location」の略で、ラベル(名前)でデータを選択します。インデックスに名前がついている場合に特に便利です。

📝 locの書き方

df.loc[‘ラベル名’] → 1行を選択

df.loc[[‘ラベル1’, ‘ラベル2’]] → 複数行を選択

df.loc[‘ラベル’, ‘列名’] → 行と列を同時に指定

df.loc[:, ‘列名’] → 全行の特定列

コード:locでラベル名を指定

import pandas as pd

# 成績データ(インデックスに名前を設定)
data = {
    '数学': [85, 92, 78],
    '英語': [90, 88, 82],
    '国語': [78, 85, 88]
}

# indexパラメータで行インデックスを指定
df = pd.DataFrame(data, index=['太郎', '花子', '次郎'])

print("DataFrame:")
print(df)

print()

# 太郎のデータを取得
print("太郎のデータ(loc['太郎']):")
print(df.loc['太郎'])

print()

# 花子のデータを取得
print("花子のデータ(loc['花子']):")
print(df.loc['花子'])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
    数学  英語  国語
太郎  85  90  78
花子  92  88  85
次郎  78  82  88

太郎のデータ(loc['太郎']):
数学    85
英語    90
国語    78
Name: 太郎, dtype: int64

花子のデータ(loc['花子']):
数学    92
英語    88
国語    85
Name: 花子, dtype: int64

💡 コードの解説

pd.DataFrame(data, index=[‘太郎’, ‘花子’, ‘次郎’])

 ・indexパラメータで行インデックスに名前を設定

 ・通常は0, 1, 2ですが、ここでは太郎、花子、次郎になります

df.loc[‘太郎’]

 ・インデックスが「太郎」の行を取得

 ・番号ではなく名前で指定できます

📝 locで行と列を同時に指定

コード:locで行と列を同時に選択

import pandas as pd

data = {
    '数学': [85, 92, 78, 88],
    '英語': [90, 88, 82, 95],
    '国語': [78, 85, 88, 82]
}

df = pd.DataFrame(data, index=['太郎', '花子', '次郎', '美咲'])

print("DataFrame:")
print(df)

print()

# 太郎の数学の点数
print("太郎の数学:")
print(df.loc['太郎', '数学'])

print()

# 花子と次郎の英語と国語
print("花子と次郎の英語と国語:")
print(df.loc[['花子', '次郎'], ['英語', '国語']])

print()

# 全員の数学
print("全員の数学:")
print(df.loc[:, '数学'])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
    数学  英語  国語
太郎  85  90  78
花子  92  88  85
次郎  78  82  88
美咲  88  95  82

太郎の数学:
85

花子と次郎の英語と国語:
    英語  国語
花子  88  85
次郎  82  88

全員の数学:
太郎    85
花子    92
次郎    78
美咲    88
Name: 数学, dtype: int64

📌 ilocとlocの使い分け

メソッド 指定方法 使用例 適した場面
iloc 位置(番号) df.iloc[0], df.iloc[1:3] 「上から3行」など位置で指定したい時
loc ラベル(名前) df.loc[‘太郎’], df.loc[‘2024-01-01’] 「太郎のデータ」など名前で指定したい時

🔍 4. 条件抽出

データ分析で最もよく使うのが条件抽出です。「年齢が25歳以上」「売上が10万円以上」など、条件に合うデータだけを取り出すことができます。

🔰 単一条件での抽出

条件式を使って、条件に合う行だけを抽出します。条件式はTrue/Falseを返し、Trueの行だけが抽出されます。

📝 条件抽出の書き方

df[df[‘列名’] 条件]

条件式の演算子:

 ・== → 等しい

 ・!= → 等しくない

 ・> → より大きい

 ・>= → 以上

 ・< → より小さい

 ・<= → 以下

コード:条件抽出の基本

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26],
    '年収': [400, 380, 450, 390, 420]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 25歳以上
print("25歳以上:")
print(df[df['年齢'] >= 25])

print()

# 年収400万円以上
print("年収400万円以上:")
print(df[df['年収'] >= 400])

print()

# 名前が太郎
print("名前が太郎:")
print(df[df['名前'] == '太郎'])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  年齢  年収
0  太郎  25 400
1  花子  23 380
2  次郎  27 450
3  美咲  24 390
4  健太  26 420

25歳以上:
   名前  年齢  年収
0  太郎  25 400
2  次郎  27 450
4  健太  26 420

年収400万円以上:
   名前  年齢  年収
0  太郎  25 400
2  次郎  27 450
4  健太  26 420

名前が太郎:
   名前  年齢  年収
0  太郎  25 400

💡 条件抽出の仕組み

条件式は、各行に対してTrue/Falseを返します。

例:df[‘年齢’] >= 25 の結果:

 ・0: True(25歳 >= 25)→ 抽出される

 ・1: False(23歳 >= 25)→ 抽出されない

 ・2: True(27歳 >= 25)→ 抽出される

 ・3: False(24歳 >= 25)→ 抽出されない

 ・4: True(26歳 >= 25)→ 抽出される

Trueの行だけが結果に含まれます。

📝 複数条件(AND)

「条件1 かつ 条件2」のように、複数の条件を同時に満たすデータを抽出するには&演算子を使います。

📝 AND条件の書き方

df[(条件1) & (条件2)]

・各条件をカッコ( )で囲みます(必須)

&でAND(かつ)を表します

・Pythonの「and」は使えません

コード:AND条件での抽出

import pandas as pd

data = {
    '商品名': ['商品A', '商品B', '商品C', '商品D', '商品E'],
    '価格': [1000, 1500, 2000, 800, 1200],
    '在庫': [50, 80, 30, 90, 60]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 価格1000円以上 かつ 在庫50個以上
print("価格1000円以上 かつ 在庫50個以上:")
result = df[(df['価格'] >= 1000) & (df['在庫'] >= 50)]
print(result)

print()

# 価格1500円以下 かつ 在庫70個以上
print("価格1500円以下 かつ 在庫70個以上:")
result2 = df[(df['価格'] <= 1500) & (df['在庫'] >= 70)]
print(result2)

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   商品名    価格  在庫
0  商品A  1000  50
1  商品B  1500  80
2  商品C  2000  30
3  商品D   800  90
4  商品E  1200  60

価格1000円以上 かつ 在庫50個以上:
   商品名    価格  在庫
0  商品A  1000  50
1  商品B  1500  80
4  商品E  1200  60

価格1500円以下 かつ 在庫70個以上:
   商品名    価格  在庫
1  商品B  1500  80
3  商品D   800  90

📘 複数条件(OR)

「条件1 または 条件2」のように、どちらかの条件を満たすデータを抽出するには|演算子を使います。

📝 OR条件の書き方

df[(条件1) | (条件2)]

・各条件をカッコ( )で囲みます(必須)

|でOR(または)を表します

・Pythonの「or」は使えません

コード:OR条件での抽出

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '都市': ['東京', '大阪', '東京', '福岡', '東京'],
    '年齢': [25, 23, 27, 24, 26]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 東京 または 大阪
print("東京 または 大阪:")
result = df[(df['都市'] == '東京') | (df['都市'] == '大阪')]
print(result)

print()

# 25歳未満 または 27歳以上
print("25歳未満 または 27歳以上:")
result2 = df[(df['年齢'] < 25) | (df['年齢'] >= 27)]
print(result2)

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  都市  年齢
0  太郎  東京  25
1  花子  大阪  23
2  次郎  東京  27
3  美咲  福岡  24
4  健太  東京  26

東京 または 大阪:
   名前  都市  年齢
0  太郎  東京  25
1  花子  大阪  23
2  次郎  東京  27
4  健太  東京  26

25歳未満 または 27歳以上:
   名前  都市  年齢
1  花子  大阪  23
2  次郎  東京  27
3  美咲  福岡  24

⚠️ 複数条件の重要な注意点

Pandasでは「and」「or」ではなく「&」「|」を使います!

❌ 間違い:df[(df['年齢'] >= 25) and (df['年収'] >= 400)]

 → エラーになります

✅ 正しい:df[(df['年齢'] >= 25) & (df['年収'] >= 400)]

各条件は必ずカッコ( )で囲んでください!

❌ 間違い:df[df['年齢'] >= 25 & df['年収'] >= 400]

✅ 正しい:df[(df['年齢'] >= 25) & (df['年収'] >= 400)]

🎨 5. 文字列を含む条件抽出

文字列データに対して、「特定の文字を含む」「〜で始まる」「〜で終わる」といった条件で抽出することができます。

🔰 特定の文字を含む

📝 文字列検索の書き方

df[df[‘列名’].str.contains(‘検索語’)] → 含む

df[df[‘列名’].str.startswith(‘検索語’)] → 〜で始まる

df[df[‘列名’].str.endswith(‘検索語’)] → 〜で終わる

コード:文字列を含むデータを抽出

import pandas as pd

data = {
    '商品名': ['リンゴジュース', 'オレンジジュース', 'バナナ', 'リンゴ', 'オレンジ'],
    '価格': [150, 180, 100, 120, 130]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# 商品名に「ジュース」を含む
print("商品名に「ジュース」を含む:")
print(df[df['商品名'].str.contains('ジュース')])

print()

# 商品名に「リンゴ」を含む
print("商品名に「リンゴ」を含む:")
print(df[df['商品名'].str.contains('リンゴ')])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
         商品名  価格
0    リンゴジュース 150
1  オレンジジュース 180
2        バナナ 100
3        リンゴ 120
4      オレンジ 130

商品名に「ジュース」を含む:
         商品名  価格
0    リンゴジュース 150
1  オレンジジュース 180

商品名に「リンゴ」を含む:
       商品名  価格
0  リンゴジュース 150
3      リンゴ 120

💡 str.contains()の解説

df[‘商品名’].str.contains(‘ジュース’)

 ・.str:文字列メソッドにアクセス

 ・.contains(‘ジュース’):「ジュース」を含むか判定

 ・各行に対してTrue/Falseを返します

結果:

 ・リンゴジュース → True(含む)

 ・オレンジジュース → True(含む)

 ・バナナ → False(含まない)

 ・リンゴ → False(含まない)

 ・オレンジ → False(含まない)

📝 〜で始まる・〜で終わる

コード:前方一致・後方一致

import pandas as pd

data = {
    '商品コード': ['A001', 'A002', 'B001', 'B002', 'C001'],
    '商品名': ['商品A1', '商品A2', '商品B1', '商品B2', '商品C1']
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print()

# Aで始まるコード
print("Aで始まるコード:")
print(df[df['商品コード'].str.startswith('A')])

print()

# 1で終わる商品名
print("1で終わる商品名:")
print(df[df['商品名'].str.endswith('1')])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   商品コード  商品名
0   A001 商品A1
1   A002 商品A2
2   B001 商品B1
3   B002 商品B2
4   C001 商品C1

Aで始まるコード:
   商品コード  商品名
0   A001 商品A1
1   A002 商品A2

1で終わる商品名:
   商品コード  商品名
0   A001 商品A1
2   B001 商品B1
4   C001 商品C1

📊 6. 実践:データ抽出の組み合わせ

ここまで学んだ抽出方法を組み合わせて、実際のデータ分析で使うような操作を行ってみましょう。

コード:売上データの分析

import pandas as pd

# 売上データを作成
data = {
    '日付': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
    '店舗': ['新宿店', '渋谷店', '新宿店', '池袋店', '渋谷店'],
    '売上': [120000, 135000, 150000, 145000, 160000],
    '来客数': [45, 52, 58, 55, 62]
}

df = pd.DataFrame(data)

print("全データ:")
print(df)

print()

# 売上15万円以上
print("売上15万円以上:")
high_sales = df[df['売上'] >= 150000]
print(high_sales)

print()

# 新宿店のデータ
print("新宿店のデータ:")
shinjuku = df[df['店舗'] == '新宿店']
print(shinjuku)

# 新宿店の売上合計
print(f"\n新宿店の売上合計: {shinjuku['売上'].sum():,}円")

print()

# 来客数が50人以上の店舗(店舗と来客数のみ表示)
print("来客数50人以上(店舗と来客数のみ):")
busy_stores = df[df['来客数'] >= 50]
print(busy_stores[['店舗', '来客数']])

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

全データ:
         日付  店舗     売上  来客数
0  2024-01-01 新宿店 120000   45
1  2024-01-02 渋谷店 135000   52
2  2024-01-03 新宿店 150000   58
3  2024-01-04 池袋店 145000   55
4  2024-01-05 渋谷店 160000   62

売上15万円以上:
         日付  店舗     売上  来客数
2  2024-01-03 新宿店 150000   58
4  2024-01-05 渋谷店 160000   62

新宿店のデータ:
         日付  店舗     売上  来客数
0  2024-01-01 新宿店 120000   45
2  2024-01-03 新宿店 150000   58

新宿店の売上合計: 270,000円

来客数50人以上(店舗と来客数のみ):
    店舗  来客数
1  渋谷店   52
2  新宿店   58
3  池袋店   55
4  渋谷店   62

💡 抽出と集計の組み合わせ

抽出したデータに対して、さらに計算を行うことができます:

shinjuku[‘売上’].sum()

 ・新宿店のデータから売上列を取り出し

 ・.sum()で合計を計算

busy_stores[[‘店舗’, ‘来客数’]]

 ・条件抽出したデータから、さらに必要な列だけを選択

 ・このように抽出を連鎖させることができます

📝 練習問題

ここまで学んだことを、実際に手を動かして確認しましょう。

問題1:列の選択(初級)

📋 問題

以下のDataFrameから、「商品名」と「価格」の列だけを選択してください。

・商品名: [‘商品A’, ‘商品B’, ‘商品C’]

・価格: [1000, 1500, 2000]

・在庫: [50, 80, 60]

解答例を見る

コード

import pandas as pd

data = {
    '商品名': ['商品A', '商品B', '商品C'],
    '価格': [1000, 1500, 2000],
    '在庫': [50, 80, 60]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print("\n商品名と価格のみ:")
result = df[['商品名', '価格']]
print(result)

実行結果

元のDataFrame:
   商品名    価格  在庫
0  商品A  1000  50
1  商品B  1500  80
2  商品C  2000  60

商品名と価格のみ:
   商品名    価格
0  商品A  1000
1  商品B  1500
2  商品C  2000

問題2:ilocで行を選択(初級)

📋 問題

以下のDataFrameから、2行目と4行目を選択してください(ilocを使用)。

・名前: [‘太郎’, ‘花子’, ‘次郎’, ‘美咲’, ‘健太’]

・年齢: [25, 23, 27, 24, 26]

解答例を見る

コード

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print("\n2行目と4行目(インデックス1と3):")
result = df.iloc[[1, 3]]
print(result)

実行結果

元のDataFrame:
   名前  年齢
0  太郎  25
1  花子  23
2  次郎  27
3  美咲  24
4  健太  26

2行目と4行目(インデックス1と3):
   名前  年齢
1  花子  23
3  美咲  24

問題3:条件抽出(中級)

📋 問題

以下のDataFrameから、80点以上の点数だけを抽出してください。

・名前: [‘太郎’, ‘花子’, ‘次郎’, ‘美咲’, ‘健太’]

・点数: [85, 72, 95, 78, 90]

解答例を見る

コード

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '点数': [85, 72, 95, 78, 90]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print("\n80点以上:")
result = df[df['点数'] >= 80]
print(result)

print(f"\n80点以上の人数: {len(result)}人")

実行結果

元のDataFrame:
   名前  点数
0  太郎  85
1  花子  72
2  次郎  95
3  美咲  78
4  健太  90

80点以上:
   名前  点数
0  太郎  85
2  次郎  95
4  健太  90

80点以上の人数: 3人

問題4:複数条件 AND(中級)

📋 問題

以下のDataFrameから、価格が1000円以上 かつ 在庫が50個以上の商品を抽出してください。

・商品名: [‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’]

・価格: [1200, 800, 1500, 1000]

・在庫: [60, 70, 40, 55]

解答例を見る

コード

import pandas as pd

data = {
    '商品名': ['商品A', '商品B', '商品C', '商品D'],
    '価格': [1200, 800, 1500, 1000],
    '在庫': [60, 70, 40, 55]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print("\n価格1000円以上 かつ 在庫50個以上:")
result = df[(df['価格'] >= 1000) & (df['在庫'] >= 50)]
print(result)

実行結果

元のDataFrame:
   商品名    価格  在庫
0  商品A  1200  60
1  商品B   800  70
2  商品C  1500  40
3  商品D  1000  55

価格1000円以上 かつ 在庫50個以上:
   商品名    価格  在庫
0  商品A  1200  60
3  商品D  1000  55

問題5:複数条件 OR(上級)

📋 問題

以下のDataFrameから、「東京」または「大阪」に住んでいる人を抽出してください。

・名前: [‘太郎’, ‘花子’, ‘次郎’, ‘美咲’, ‘健太’]

・都市: [‘東京’, ‘名古屋’, ‘大阪’, ‘福岡’, ‘東京’]

・年齢: [25, 23, 27, 24, 26]

解答例を見る

コード

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '都市': ['東京', '名古屋', '大阪', '福岡', '東京'],
    '年齢': [25, 23, 27, 24, 26]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

print("\n東京 または 大阪:")
result = df[(df['都市'] == '東京') | (df['都市'] == '大阪')]
print(result)

print(f"\n該当者数: {len(result)}人")

実行結果

元のDataFrame:
   名前   都市  年齢
0  太郎   東京  25
1  花子  名古屋  23
2  次郎   大阪  27
3  美咲   福岡  24
4  健太   東京  26

東京 または 大阪:
   名前  都市  年齢
0  太郎  東京  25
2  次郎  大阪  27
4  健太  東京  26

該当者数: 3人

問題6:文字列検索と集計(上級)

📋 問題

以下のDataFrameから、商品名に「ジュース」を含む商品を抽出し、その価格の合計を計算してください。

・商品名: [‘リンゴジュース’, ‘バナナ’, ‘オレンジジュース’, ‘リンゴ’, ‘グレープジュース’]

・価格: [150, 100, 180, 120, 160]

解答例を見る

コード

import pandas as pd

data = {
    '商品名': ['リンゴジュース', 'バナナ', 'オレンジジュース', 'リンゴ', 'グレープジュース'],
    '価格': [150, 100, 180, 120, 160]
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)

# 商品名に「ジュース」を含む商品を抽出
print("\n「ジュース」を含む商品:")
juice = df[df['商品名'].str.contains('ジュース')]
print(juice)

# 合計を計算
print(f"\nジュースの価格合計: {juice['価格'].sum()}円")
print(f"ジュースの種類: {len(juice)}種類")

実行結果

元のDataFrame:
         商品名  価格
0    リンゴジュース 150
1        バナナ 100
2  オレンジジュース 180
3        リンゴ 120
4  グレープジュース 160

「ジュース」を含む商品:
         商品名  価格
0    リンゴジュース 150
2  オレンジジュース 180
4  グレープジュース 160

ジュースの価格合計: 490円
ジュースの種類: 3種類

🎯 このステップのまとめ

✅ 学んだこと

df[‘列名’]で列を選択できる

df[[‘列1’, ‘列2’]]で複数列を選択できる(二重カッコに注意)

ilocで位置(番号)を指定して行を選択できる

locでラベル(名前)を指定して行を選択できる

条件式でデータを抽出できる

&(AND)と|(OR)で複数条件を組み合わせられる

str.contains()で文字列検索ができる

💡 次のステップに進む前に確認

以下のことができるようになったか確認しましょう:

□ 列を選択できますか?(1列、複数列)

□ ilocとlocの違いがわかりますか?

□ 条件式でデータを抽出できますか?

□ 複数条件(&、|)を使えますか?

□ 文字列検索ができますか?

これらができたら、次のステップに進みましょう!

❓ よくある質問

Q1: ilocとlocはどう使い分けますか?

A: iloc位置(0, 1, 2…)で選択、locラベル名で選択します。インデックスに意味のある名前がついている場合(日付、商品名など)はlocが便利です。プログラムで自動処理する場合はilocが使いやすいです。

Q2: なぜ&とandは違うのですか?

A: &配列全体に対する演算子and単一の真偽値に対する演算子です。Pandasでは複数行に対して条件を適用するため、&を使う必要があります。また、各条件をカッコ()で囲むのを忘れずに!

Q3: 条件抽出で何も見つからない場合は?

A: 空のDataFrameが返されます。エラーにはなりません。len()で行数を確認すると0になります。条件が厳しすぎる可能性があるので、条件を緩めてみましょう。

Q4: str.contains()でエラーが出ます

A: 列にNaN(欠損値)が含まれている可能性があります。na=Falseオプションを追加してください。df['列'].str.contains('検索語', na=False)これでNaNを無視できます。

Q5: 抽出結果を元のDataFrameに反映させるには?

A: 抽出はコピーを返すので、元のDataFrameは変わりません。反映させたい場合は、変数に代入し直します。df = df[条件]または、df.drop()で不要な行を削除します。ただし、元データは残しておくことをお勧めします。

📝

学習メモ

Pythonデータ分析入門 - Step 24

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE