🎯 ステップ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