【DataFrame】データフレームの基本構造と作成方法【Pandas入門】
DataFrameはPandasの中核となるデータ構造です。ラベル付きの2次元テーブルで、各列は独自のdtypeと名前を持つSeriesです。DataFrameはコード上のExcelシートやSQLテーブルのようなものですが、より強力です。プログラムで操作でき、拡張可能で、バージョン管理もできます。このセクションでは、DataFrameの基本的な構造を深く学んでいきましょう。
⚠️ 注意: 以下のコードにはローカルのPython環境が必要です。
1. このセクションで学ぶこと
- ❶ DataFrameの本質(Seriesの集合体)
- ❷ 行・列のインデックスシステム(Index + Columns)
- ❸ DataFrameを作成する複数の方法
- ❹ データの確認(info / describe / head / tail)
- ❺ 主要なプロパティ(shape / index / columns / dtypes / values)
2. チャーリーのECサイト商品テーブル
(1) 課題:複数の列をまとめて管理したい
チャーリーはECサイトを運営しており、商品データを管理する必要があります。商品名、カテゴリ、価格、在庫数、評価の5つの列があり、それぞれ型が異なります。Seriesだけでは、5つの個別のSeriesオブジェクトを維持し、インデックスの整合性を手動で保たなければなりません。
PYTHON
import pandas as pd
# 5つの個別のSeries — インデックスの整合性を手動で保つ必要がある
names = pd.Series(['ノートPC', 'スマートフォン', 'タブレット', 'モニター', 'キーボード'])
categories = pd.Series(['家電', '家電', '家電', '家電', 'アクセサリー'])
prices = pd.Series([999.99, 699.99, 349.99, 449.99, 79.99])
stocks = pd.Series([50, 120, 80, 35, 200])
ratings = pd.Series([4.7, 4.5, 4.3, 4.6, 4.2])
# どの価格がどの商品に対応している?インデックスが揃っていることを祈るしかない!
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) 解決策:DataFrameで列をまとめる
▶ サンプル:DataFrameで商品データを管理する(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['ノートPC', 'スマートフォン', 'タブレット', 'モニター', 'キーボード'],
'category': ['家電', '家電', '家電', '家電', 'アクセサリー'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
print(df)
# name category price stock rating
# 0 ノートPC 家電 999.99 50 4.7
# 1 スマートフォン 家電 699.99 120 4.5
# 2 タブレット 家電 349.99 80 4.3
# 3 モニター 家電 449.99 35 4.6
# 4 キーボード アクセサリー 79.99 200 4.2
print(df['name']) # Series
print(df.loc[0]) # 最初の行をSeriesとして取得
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
5つの列すべてが1つのDataFrameにまとめられ、自己説明的な列名と自動的な行の整合性が保たれます。
(3) メリット:DataFrameは「列の集合体」
DataFrameは「2次元のndarray」ではありません。Seriesの順序付き辞書です。各列は独自のdtypeを持つ独立したSeriesですが、すべての列は同じ行のIndexを共有しています。
3. DataFrameの基本的な構造
(1) 内部構造図
graph TB
subgraph DataFrame
direction TB
COL["Columns Index<br/>(name, category, price, stock, rating)"]
ROW["Row Index<br/>(0, 1, 2, 3, 4)"]
S1["Series: name<br/>dtype: object"]
S2["Series: category<br/>dtype: object"]
S3["Series: price<br/>dtype: float64"]
S4["Series: stock<br/>dtype: int64"]
S5["Series: rating<br/>dtype: float64"]
end
ROW --> S1
ROW --> S2
ROW --> S3
ROW --> S4
ROW --> S5
COL --> S1
COL --> S2
COL --> S3
COL --> S4
COL --> S5
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
| 概念 | 説明 | 例え |
|---|---|---|
| 行インデックス | すべての列で共有される行ラベル | Excelの行番号 |
| Columns | 各列の名前ラベル | Excelの列ヘッダー |
| 列Series | 各列は独立したSeries | Excelの1列 |
| values | 内部の2次元ndarray | 生のデータ行列 |
(2) DataFrameと2次元ndarrayの比較
| 機能 | NumPy 2次元ndarray | Pandas DataFrame |
|---|---|---|
| 型の制約 | 全体で1つのdtype | 列ごとに独立したdtype |
| 行ラベル | なし(整数の位置) | Index(カスタマイズ可能) |
| 列ラベル | なし(整数の位置) | Columns(列名) |
| 列の選択 | arr[:, 2] |
df['price'] |
| 行の選択 | arr[0, :] |
df.loc[0] |
| 混合型 | 非対応 | ネイティブに対応 |
| 欠損値 | np.nan(floatのみ) | NaN / NaT / pd.NA |
📌 ポイント: DataFrameの
valuesプロパティは2次元のndarrayを返しますが、混合型の場合はobject型になります。パフォーマンスが大幅に低下するため、純粋な数値演算を行う場合は、まず数値列を選択してから.valuesを呼び出してください。
4. DataFrameを作成する複数の方法
(1) 辞書から作成(最も一般的)
▶ サンプル:辞書からDataFrameを作成する(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
# リストの辞書:キー = 列名、値 = 列データ
df = pd.DataFrame({
'product': ['コーヒー', '紅茶', 'ジュース', '水'],
'price': [4.50, 3.80, 5.20, 1.50],
'calories': [5, 2, 120, 0]
})
print(df)
# product price calories
# 0 コーヒー 4.50 5
# 1 紅茶 3.80 2
# 2 ジュース 5.20 120
# 3 水 1.50 0
# カスタム行インデックス
df2 = pd.DataFrame({
'product': ['コーヒー', '紅茶', 'ジュース'],
'price': [4.50, 3.80, 5.20]
}, index=['A001', 'A002', 'A003'])
print(df2.index) # Index(['A001', 'A002', 'A003'])
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) リストのリストから作成
▶ サンプル:リストのリストからDataFrameを作成する(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
# リストのリスト:内側の各リスト = 1行
data = [
['コーヒー', 4.50, 5],
['紅茶', 3.80, 2],
['ジュース', 5.20, 120],
['水', 1.50, 0]
]
df = pd.DataFrame(data, columns=['product', 'price', 'calories'])
print(df)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(3) 辞書のリストから作成
▶ サンプル:辞書のリストからDataFrameを作成する(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
# 辞書のリスト:各辞書 = 1行
data = [
{'product': 'コーヒー', 'price': 4.50, 'calories': 5},
{'product': '紅茶', 'price': 3.80, 'calories': 2},
{'product': 'ジュース', 'price': 5.20, 'calories': 120}
]
df = pd.DataFrame(data)
print(df)
# 存在しないキーはNaNになる
data2 = [
{'product': 'コーヒー', 'price': 4.50},
{'product': '紅茶', 'calories': 2}
]
df2 = pd.DataFrame(data2)
print(df2)
# product price calories
# 0 コーヒー 4.50 NaN
# 1 紅茶 NaN 2.0
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(4) NumPyのndarrayから作成
▶ サンプル:ndarrayからDataFrameを作成する(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import numpy as np
import pandas as pd
arr = np.random.randn(4, 3) # 4行3列の乱数
df = pd.DataFrame(arr, columns=['A', 'B', 'C'])
print(df.shape) # (4, 3)
print(df.dtypes) # すべてfloat64
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(5) 作成方法の比較
| 方法 | 構文 | 特徴 | ユースケース |
|---|---|---|---|
| 辞書 | pd.DataFrame({'col': [data]}) |
列志向、最も自然 | 最も一般的 |
| リストのリスト | pd.DataFrame([[r1c1, ...], ...]) |
行志向 | 行ごとに構築する場合 |
| 辞書のリスト | pd.DataFrame([{'col': val, ...}, ...]) |
行志向、欠落キーは自動でNaN | API/JSONデータ |
| ndarray | pd.DataFrame(np.array(...)) |
同質データ | NumPyデータの変換 |
| read_csv | pd.read_csv('file.csv') |
ファイルから読み込み | 実際のプロジェクトで最も一般的 |
5. データの確認と探索
(1) クイックプレビュー:head / tail / sample
▶ サンプル:DataFrameのプレビュー(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['ノートPC', 'スマートフォン', 'タブレット', 'モニター', 'キーボード',
'マウス', 'ヘッドセット', 'スピーカー', 'カメラ', '充電器'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99,
29.99, 149.99, 89.99, 599.99, 19.99],
'stock': [50, 120, 80, 35, 200, 300, 150, 180, 25, 500]
})
print(df.head()) # 最初の5行
print(df.head(3)) # 最初の3行
print(df.tail(2)) # 最後の2行
print(df.sample(3)) # ランダムに3行(確認用)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) データの概要:info
▶ サンプル:infoメソッドの詳細(難易度 ⭐⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['アリス', 'ボブ', 'チャーリー', 'キャロル', 'デビッド'],
'age': [28, 34, 25, 30, 45],
'salary': [75000.0, 92000.0, np.nan, 88000.0, 105000.0],
'department': ['営業', 'エンジニアリング', 'マーケティング', '営業', '経営']
})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 4 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 name 5 non-null object
# 1 age 5 non-null int64
# 2 salary 4 non-null float64 ← 欠損値が1つ!
# 3 department 5 non-null object
# dtypes: float64(1), int64(1), object(2)
# memory usage: 288.0+ bytes
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
info()はデータ分析の最初のステップです。行数、各列のdtype、欠損値の有無、メモリ使用量を教えてくれます。
(3) 統計サマリー:describe
▶ サンプル:describeによる統計サマリー(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
# 数値列のみ(デフォルト)
print(df.describe())
# price stock rating
# count 5.00 5.00 5.00
# mean 515.79 97.00 4.46
# std 347.31 69.72 0.21
# min 79.99 35.00 4.20
# 25% 349.99 50.00 4.30
# 50% 449.99 80.00 4.50
# 75% 699.99 120.00 4.60
# max 999.99 200.00 4.70
# すべての列を含む
print(df.describe(include='all'))
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
| メソッド | 表示内容 | ユースケース |
|---|---|---|
df.head() |
最初の5行 | データ形式のクイック確認 |
df.info() |
行数 / 列のdtype / 欠損値 / メモリ | 最初に必ず確認するステップ |
df.describe() |
数値列の統計サマリー | 分布の把握 |
df.shape |
(行数, 列数) | データの次元 |
df.dtypes |
各列のdtype | 型の確認 |
6. DataFrameの主要プロパティ
(1) プロパティ早見表
| プロパティ | 戻り値の型 | 説明 | 例 |
|---|---|---|---|
df.shape |
tuple | (行数, 列数) | (5, 4) |
df.index |
Index | 行ラベル | RangeIndex(0, 5) |
df.columns |
Index | 列名 | Index(['name', 'age', ...]) |
df.dtypes |
Series | 各列のdtype | name: object, age: int64 |
df.values |
ndarray | 内部データ | 2次元配列 |
df.ndim |
int | 次元数 | 2 |
df.size |
int | 要素の総数 | 20(5行 x 4列) |
df.T |
DataFrame | 転置 | 行と列が入れ替わる |
▶ サンプル:主要プロパティの一覧(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['アリス', 'ボブ', 'チャーリー'],
'age': [28, 34, 25],
'salary': [75000.0, 92000.0, 68000.0]
})
print(f"Shape: {df.shape}") # (3, 3)
print(f"Index: {df.index}") # RangeIndex(0, 3)
print(f"Columns: {df.columns}") # Index(['name', 'age', 'salary'])
print(f"Dtypes:\n{df.dtypes}")
print(f"Size: {df.size}") # 9
print(f"Ndim: {df.ndim}") # 2
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) 列の選択と追加
▶ サンプル:列の操作(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['アリス', 'ボブ', 'チャーリー'],
'age': [28, 34, 25],
'salary': [75000.0, 92000.0, 68000.0]
})
# 単一の列を選択 → Series
print(type(df['name'])) # <class 'pandas.core.series.Series'>
# 複数の列を選択 → DataFrame
print(df[['name', 'salary']])
# 新しい列を追加
df['bonus'] = df['salary'] * 0.1
df['level'] = df['age'].apply(lambda x: 'シニア' if x >= 30 else 'ジュニア')
print(df)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(3) 転置
▶ サンプル:DataFrameの転置(難易度 ⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
df = pd.DataFrame({
'Q1': [320, 280, 350],
'Q2': [410, 390, 420]
}, index=['商品A', '商品B', '商品C'])
print(df.T)
# 商品A 商品B 商品C
# Q1 320 280 350
# Q2 410 390 420
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
7. 総合サンプル:ECサイト商品テーブルのエンドツーエンド
▶ サンプル:商品データの作成と探索(難易度 ⭐⭐⭐)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np
# ============================================
# 総合サンプル:ECサイト商品テーブルの
# 作成と探索
# ============================================
# 1. DataFrameの作成
products = pd.DataFrame({
'name': ['ノートPC', 'スマートフォン', 'タブレット', 'モニター', 'キーボード',
'マウス', 'ヘッドセット', 'スピーカー'],
'category': ['家電', '家電', '家電',
'家電', 'アクセサリー', 'アクセサリー',
'アクセサリー', 'アクセサリー'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99,
29.99, 149.99, 89.99],
'stock': [50, 120, 80, 35, 200, 300, 150, 180],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2, 4.0, 4.4, 4.1]
})
# 2. 概要
print("=== 商品カタログ概要 ===")
print(f"商品数: {len(products)}")
print(f"カテゴリ: {products['category'].unique().tolist()}")
print(f"列: {products.columns.tolist()}")
# 3. データ型とメモリ
print(f"\n=== データ型 ===")
print(products.dtypes)
print(f"\nメモリ使用量: {products.memory_usage(deep=True).sum() / 1024:.1f} KB")
# 4. クイック統計
print(f"\n=== 価格の統計 ===")
print(products['price'].describe())
# 5. 商品ごとの在庫金額
products['inventory_value'] = products['price'] * products['stock']
print(f"\n=== 在庫金額トップ3 ===")
print(products.nlargest(3, 'inventory_value')[['name', 'inventory_value']])
# 6. カテゴリ別の集計
print(f"\n=== カテゴリ別サマリー ===")
cat_summary = products.groupby('category').agg(
count=('name', 'count'),
avg_price=('price', 'mean'),
total_stock=('stock', 'sum')
)
print(cat_summary)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)して試してみてください。実際の値はpandasのバージョンによって若干異なる場合があります。
期待される出力(抜粋):
TEXT
=== 商品カタログ概要 ===
商品数: 8
カテゴリ: ['家電', 'アクセサリー']
列: ['name', 'category', 'price', 'stock', 'rating']
=== 価格の統計 ===
count 8.00
mean 349.99
std 339.32
min 29.99
max 999.99
=== 在庫金額トップ3 ===
name inventory_value
0 ノートPC 49999.50
1 スマートフォン 83998.80
3 モニター 15749.65
=== カテゴリ別サマリー ===
count avg_price total_stock
category
アクセサリー 4 87.24 830
家電 4 624.99 285
❓ よくある質問
Q DataFrameとSeriesの関係は何ですか?
A DataFrameはSeriesの順序付き集合体です。各列は1つのSeriesであり、すべての列は同じ行のIndexを共有しています。単一の列を選択するとSeriesが返され、複数の列を選択するとDataFrameが返されます。単一の行を選択した場合もSeriesが返されます(列名がIndexになります)。
Q 列を数値インデックスでアクセスできますか?
A はい、できます。列名が整数(例:
0, 1, 2)の場合、df[0]は曖昧になります。Pandasはこれを位置ではなく列名として扱います。その場合は、位置によるアクセスにはdf.iloc[:, 0]を、ラベルによるアクセスにはdf.loc[:, 0]を使用してください。混乱を避けるため、文字列の列名を使用することをお勧めします。Q infoとdescribeの違いは何ですか?
A infoは構造情報(行数 / 列のdtype / 欠損値 / メモリ)を表示し、describeは統計サマリー(平均 / 標準偏差 / 四分位数 / 最小値・最大値)を表示します。infoは「データがどのような構造か」に答え、describeは「値がどのように分布しているか」に答えます。両者は補完関係にあります。データセットを初めて扱う際は、両方を確認してください。
Q 列の追加や削除はどうすればよいですか?
A 列の追加には
df['new_col'] = values(末尾に追加)またはdf.insert(pos, 'new_col', values)(特定の位置に挿入)を使用します。列の削除にはdf.drop('col', axis=1)またはdel df['col']を使用します。dropは新しいDataFrameを返しますが(元は変更されません)、delはその場で変更します。Q valuesは何を返しますか?
A
df.valuesは内部の2次元NumPy ndarrayを返します。DataFrameが混合型(例:object + int64)の場合、ndarrayのdtypeはobjectにアップキャストされ、ベクトル化のパフォーマンスが失われます。純粋に数値のみのDataFrameの場合、valuesは数値のdtypeを維持します。Q DataFrameを転置するにはどうすればよいですか?
A
df.Tまたはdf.transpose()を使用します。転置後、行が列に、列が行になります。注意:元のDataFrameが混合型の場合、転置後はすべての列がobject型になります(ndarrayは同質の型を要求するため)。Q DataFrameの作成には辞書とリストのどちらを使うべきですか?
A 辞書が最も自然な方法です(キー = 列名、値 = 列データ)。日常的な使用には辞書をお勧めします。辞書のリストは行ごとの構築に適しています(例:APIからのJSONデータ)。ndarrayは純粋な数値データに適しています。実際のプロジェクトでは、80%のケースで
pd.read_csv()を使ってファイルから読み込みます。📖 まとめ
- DataFrameは本質的にSeriesの順序付き集合体です。各列は独立したdtypeを持ち、すべて同じ行のIndexを共有しています
- 行のIndex + Columnsが2次元のラベリングシステムを構成し、データが自己説明的になります
- 作成方法:辞書(最も一般的)/ リストのリスト / 辞書のリスト / ndarray / read_csv
- データ探索の三拍子:head()で形式確認 → info()で構造確認 → describe()で分布確認
- 主要プロパティ:shape / index / columns / dtypes / values / T
- 列の選択:
df['col']はSeriesを返し、df[['c1','c2']]はDataFrameを返します - 列の追加は
df['new'] = ...、列の削除はdf.drop('col', axis=1)
📝 練習問題
- 基礎(難易度 ⭐):3つの異なる方法で学生テーブル(名前 / 数学 / 英語 / 理科)を作成し、infoとdescribeの結果を出力してください。
- 中級(難易度 ⭐⭐):欠損値を含む従業員テーブル(名前 / 年齢 / 給与 / 部署、給与に2つのNaNエントリ)を作成し、以下を行ってください:infoで欠損値を確認 → 各列の非Null比率を計算 → salary_level列を追加(給与 > 80000は「高」、それ以外は「低」、NaNは「不明」)。
- 挑戦(難易度 ⭐⭐⭐):辞書のリストからDataFrameを構築し(5レコード、一部のキーが欠落)、以下を行ってください:欠損値の確認 → 列の平均値/最頻値で埋める → 行ごとの非Nullフィールド数をカウント → completeness列(非Null比率)を追加し、最後に完全なdescribeレポートを出力してください。



