📋 このステップで学ぶこと
- CSVファイルへのエクスポート(文字化け対策含む)
- Excelファイルへのエクスポート(複数シート・書式設定)
- JSONファイルへのエクスポート(orientパラメータ)
- Parquet形式(高速&高圧縮)
- 各形式の使い分けと最適化
⏱️ 学習時間の目安:2時間
📝 練習問題:10問(基礎4問・応用4問・発展2問)
🎯 1. ファイルエクスポートの基本
1-1. なぜファイルにエクスポートするのか?
データベース以外にも、ファイル形式でデータを保存することがあります。
用途に応じて最適な形式を選ぶことが重要です。
📚 例え話:料理のレシピの保存形式
ファイル形式は、料理のレシピをどう保存するかに似ています。
・CSV:メモ帳に書いた簡単なレシピ(誰でも読める)
・Excel:きれいに整理された料理本(見栄えが良い)
・JSON:レシピデータベース(構造化されている)
・Parquet:圧縮された電子書籍(軽量で高速)
1-2. 主なファイル形式の比較
ファイル形式の特徴比較
| 形式 |
特徴 |
メリット |
デメリット |
| CSV |
カンマ区切りテキスト |
どこでも開ける、軽量 |
データ型が保存されない、文字化けしやすい |
| Excel |
表計算ソフト用 |
見栄えが良い、書式設定可能 |
ファイルサイズが大きい、100万行制限 |
| JSON |
階層構造データ |
構造を保持、API連携に最適 |
ファイルサイズが大きい |
| Parquet |
列指向・圧縮形式 |
超高速、高圧縮、型保持 |
専用ツール必要、手動で開けない |
📊 ファイルエクスポートの主な用途
- レポート作成:ExcelやCSVで配布
- データ共有:他部署や外部への提供
- バックアップ:データの保存
- 可視化ツール:TableauやPower BIで使用
- 機械学習:学習データの準備
📄 2. CSVファイルへのエクスポート
2-1. CSVの基本
CSV(Comma-Separated Values)は、最も一般的なデータ形式です。
どんなソフトでも開けるので、データ共有に最適です。
# ===== CSVの基本 =====
import pandas as pd
# サンプルデータ
df = pd.DataFrame({
‘商品ID’: [1, 2, 3, 4, 5],
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’, ‘ぶどう’, ‘いちご’],
‘価格’: [150, 100, 80, 300, 250],
‘在庫’: [50, 100, 80, 30, 40]
})
print(“=== サンプルデータ ===”)
print(df)
# CSVファイルに保存(文字化け対策済み)
df.to_csv(‘products.csv’, index=False, encoding=’utf-8-sig’)
print(“\n✅ CSVファイルを保存しました!”)
【実行結果】
=== サンプルデータ ===
商品ID 商品名 価格 在庫
0 1 りんご 150 50
1 2 バナナ 100 100
2 3 みかん 80 80
3 4 ぶどう 300 30
4 5 いちご 250 40
✅ CSVファイルを保存しました!
🎯 to_csvの重要なパラメータ
- index=False:インデックスを保存しない(推奨)
- encoding=’utf-8-sig’:日本語の文字化けを防ぐ(超重要!)
2-2. エンコーディングの選択
⚠️ 文字化けを防ぐために
日本語を含むCSVは、エンコーディングの指定が必須です!
エンコーディングの選び方
| エンコーディング |
特徴 |
使い所 |
| utf-8-sig |
UTF-8 + BOM(バイトオーダーマーク) |
Excelで開く場合(推奨) |
| utf-8 |
UTF-8(BOMなし) |
プログラムで読む場合 |
| shift_jis |
日本語用(古い形式) |
古いExcel、レガシーシステム |
# ===== エンコーディングの比較 =====
# UTF-8(BOM付き)で保存 – Excelでも文字化けしない(推奨)
df.to_csv(‘products_utf8sig.csv’, index=False, encoding=’utf-8-sig’)
# Shift-JIS で保存 – 古いExcelで開く場合
df.to_csv(‘products_sjis.csv’, index=False, encoding=’shift_jis’)
# UTF-8(BOMなし)で保存 – プログラムで読む場合
df.to_csv(‘products_utf8.csv’, index=False, encoding=’utf-8′)
print(“3種類のエンコーディングで保存しました!”)
2-3. 区切り文字の変更
# ===== 区切り文字を変更 =====
# タブ区切り(TSV)
df.to_csv(‘products.tsv’, index=False, sep=’\t’, encoding=’utf-8-sig’)
print(“タブ区切り(TSV)で保存しました”)
# パイプ区切り
df.to_csv(‘products_pipe.txt’, index=False, sep=’|’, encoding=’utf-8-sig’)
print(“パイプ区切りで保存しました”)
2-4. 大量データの分割エクスポート
# ===== 大量データを分割してエクスポート =====
import numpy as np
# 10万件のデータを作成
large_df = pd.DataFrame({
‘ID’: range(1, 100001),
‘データ’: np.random.randint(0, 1000, 100000)
})
print(f”データ件数: {len(large_df):,}件”)
# 20,000件ずつ分割してエクスポート
chunk_size = 20000
for i, start in enumerate(range(0, len(large_df), chunk_size)):
chunk = large_df[start:start + chunk_size]
filename = f’data_part_{i+1}.csv’
chunk.to_csv(filename, index=False, encoding=’utf-8-sig’)
print(f” {filename}: {len(chunk):,}件 保存完了”)
print(“\n✅ 全てのファイルをエクスポートしました!”)
【実行結果】
データ件数: 100,000件
data_part_1.csv: 20,000件 保存完了
data_part_2.csv: 20,000件 保存完了
data_part_3.csv: 20,000件 保存完了
data_part_4.csv: 20,000件 保存完了
data_part_5.csv: 20,000件 保存完了
✅ 全てのファイルをエクスポートしました!
📗 3. Excelファイルへのエクスポート
3-1. Excelエクスポートの基本
Excel形式は、レポート作成や社内共有に最適です。
書式設定や複数シートの作成もできます。
⚠️ 必要なライブラリ
Excelエクスポートにはopenpyxlライブラリが必要です。
pip install openpyxl
# ===== Excelの基本 =====
# Excelファイルに保存
df.to_excel(‘products.xlsx’, index=False, sheet_name=’商品一覧’)
print(“✅ Excelファイルを保存しました!”)
# 保存したファイルを読み込んで確認
df_loaded = pd.read_excel(‘products.xlsx’)
print(df_loaded)
【実行結果】
✅ Excelファイルを保存しました!
商品ID 商品名 価格 在庫
0 1 りんご 150 50
1 2 バナナ 100 100
2 3 みかん 80 80
3 4 ぶどう 300 30
4 5 いちご 250 40
3-2. 複数シートに保存
# ===== 複数シートに保存 =====
# 売上データ
sales_df = pd.DataFrame({
‘日付’: pd.date_range(‘2024-01-01’, periods=5),
‘売上’: [10000, 15000, 12000, 18000, 20000]
})
# 在庫データ
stock_df = pd.DataFrame({
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’],
‘在庫’: [50, 100, 80]
})
# ExcelWriterを使って複数シートに保存
with pd.ExcelWriter(‘report.xlsx’, engine=’openpyxl’) as writer:
df.to_excel(writer, sheet_name=’商品マスタ’, index=False)
sales_df.to_excel(writer, sheet_name=’売上’, index=False)
stock_df.to_excel(writer, sheet_name=’在庫’, index=False)
print(“✅ 複数シートのExcelファイルを作成しました!”)
print(“シート一覧: 商品マスタ, 売上, 在庫”)
【実行結果】
✅ 複数シートのExcelファイルを作成しました!
シート一覧: 商品マスタ, 売上, 在庫
3-3. セルの書式設定
# ===== セルの書式設定 =====
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows
# ワークブックを作成
wb = Workbook()
ws = wb.active
ws.title = ‘商品一覧’
# データを書き込み
for row in dataframe_to_rows(df, index=False, header=True):
ws.append(row)
# ヘッダー行の書式設定(青背景、白文字、太字)
header_fill = PatternFill(start_color=”4472C4″, end_color=”4472C4″, fill_type=”solid”)
header_font = Font(color=”FFFFFF”, bold=True)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
# 価格列を通貨書式に
for row in ws.iter_rows(min_row=2, min_col=3, max_col=3):
for cell in row:
cell.number_format = ‘¥#,##0’
# 列幅を自動調整
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
if cell.value:
max_length = max(max_length, len(str(cell.value)))
ws.column_dimensions[column_letter].width = max_length + 2
# 保存
wb.save(‘products_formatted.xlsx’)
print(“✅ 書式設定したExcelファイルを作成しました!”)
【実行結果】
✅ 書式設定したExcelファイルを作成しました!
🎯 openpyxlの主な書式設定
- Font:文字色、太字、フォントサイズ
- PatternFill:セルの背景色
- number_format:数値の表示形式(通貨、日付など)
- column_dimensions:列幅の設定
📋 4. JSONファイルへのエクスポート
4-1. JSONの基本
JSON(JavaScript Object Notation)は、階層構造を持つデータに適した形式です。
Web APIとのデータ連携でよく使われます。
# ===== JSONの基本 =====
# JSONファイルに保存
df.to_json(‘products.json’, orient=’records’, force_ascii=False, indent=2)
print(“✅ JSONファイルを保存しました!”)
# 保存されたJSONの内容を表示
with open(‘products.json’, ‘r’, encoding=’utf-8′) as f:
content = f.read()
print(“\n=== products.json の内容 ===”)
print(content[:500]) # 最初の500文字
【実行結果】
✅ JSONファイルを保存しました!
=== products.json の内容 ===
[
{
“商品ID”: 1,
“商品名”: “りんご”,
“価格”: 150,
“在庫”: 50
},
{
“商品ID”: 2,
“商品名”: “バナナ”,
“価格”: 100,
“在庫”: 100
},
…
4-2. orientパラメータの種類
orientパラメータの比較
| orient |
出力形式 |
使い所 |
| ‘records’ |
[{row1}, {row2}, …] |
最も一般的。API連携に最適 |
| ‘index’ |
{index1: {row1}, …} |
インデックスをキーにしたい場合 |
| ‘columns’ |
{col1: {values}, …} |
列指向でデータを扱う場合 |
# ===== orientパラメータの比較 =====
# サンプルデータ
small_df = pd.DataFrame({
‘名前’: [‘田中’, ‘佐藤’],
‘年齢’: [25, 30]
})
print(“【orient=’records’】(最も一般的)”)
print(small_df.to_json(orient=’records’, force_ascii=False, indent=2))
print(“\n【orient=’index’】”)
print(small_df.to_json(orient=’index’, force_ascii=False, indent=2))
print(“\n【orient=’columns’】”)
print(small_df.to_json(orient=’columns’, force_ascii=False, indent=2))
【実行結果】
【orient=’records’】(最も一般的)
[
{“名前”: “田中”, “年齢”: 25},
{“名前”: “佐藤”, “年齢”: 30}
]
【orient=’index’】
{
“0”: {“名前”: “田中”, “年齢”: 25},
“1”: {“名前”: “佐藤”, “年齢”: 30}
}
【orient=’columns’】
{
“名前”: {“0”: “田中”, “1”: “佐藤”},
“年齢”: {“0”: 25, “1”: 30}
}
4-3. 日付データを含むJSON
# ===== 日付データを含むJSON =====
# 日付データを含むDataFrame
date_df = pd.DataFrame({
‘日付’: pd.date_range(‘2024-01-01’, periods=3),
‘売上’: [10000, 15000, 12000]
})
print(“=== 変換前 ===”)
print(date_df)
# 日付を文字列に変換してからエクスポート
date_df[‘日付’] = date_df[‘日付’].dt.strftime(‘%Y-%m-%d’)
date_df.to_json(‘sales.json’, orient=’records’, force_ascii=False, indent=2)
print(“\n=== sales.json の内容 ===”)
with open(‘sales.json’, ‘r’, encoding=’utf-8′) as f:
print(f.read())
【実行結果】
=== 変換前 ===
日付 売上
0 2024-01-01 10000
1 2024-01-02 15000
2 2024-01-03 12000
=== sales.json の内容 ===
[
{
“日付”: “2024-01-01”,
“売上”: 10000
},
{
“日付”: “2024-01-02”,
“売上”: 15000
},
{
“日付”: “2024-01-03”,
“売上”: 12000
}
]
⚡ 5. Parquet形式(高速&高圧縮)
5-1. Parquetとは?
Parquet(パーケイ)は、ビッグデータ処理に最適な形式です。
圧縮率が高く、読み込み速度も非常に速いです。
📊 Parquetのメリット
- 超高速:CSVの10倍以上速い
- 高圧縮:ファイルサイズが1/5〜1/10になることも
- データ型保持:型情報が保存される
- 列指向:必要な列だけ読み込める
5-2. 基本的なParquetエクスポート
# ===== Parquetの基本 =====
# Parquetファイルに保存
df.to_parquet(‘products.parquet’, index=False, compression=’snappy’)
print(“✅ Parquetファイルを保存しました!”)
# ファイルを読み込んで確認
df_loaded = pd.read_parquet(‘products.parquet’)
print(df_loaded)
【実行結果】
✅ Parquetファイルを保存しました!
商品ID 商品名 価格 在庫
0 1 りんご 150 50
1 2 バナナ 100 100
2 3 みかん 80 80
3 4 ぶどう 300 30
4 5 いちご 250 40
圧縮方式の比較
| 圧縮方式 |
特徴 |
おすすめ場面 |
| ‘snappy’ |
バランス型(推奨) |
一般的な用途 |
| ‘gzip’ |
高圧縮(やや遅い) |
ストレージ節約重視 |
| ‘brotli’ |
最高圧縮(最も遅い) |
アーカイブ用途 |
| None |
圧縮なし(最速) |
速度最優先 |
5-3. CSVとParquetの比較
# ===== CSVとParquetの比較 =====
import numpy as np
import os
import time
# 100万件のデータを作成
print(“=== 100万件のデータを作成中… ===”)
large_df = pd.DataFrame({
‘ID’: range(1, 1000001),
‘名前’: [f’ユーザー{i}’ for i in range(1, 1000001)],
‘年齢’: np.random.randint(20, 70, 1000000),
‘金額’: np.random.randint(1000, 100000, 1000000)
})
print(f”データ件数: {len(large_df):,}件”)
# CSV保存
start = time.time()
large_df.to_csv(‘large_data.csv’, index=False, encoding=’utf-8-sig’)
csv_save_time = time.time() – start
# Parquet保存
start = time.time()
large_df.to_parquet(‘large_data.parquet’, index=False, compression=’snappy’)
parquet_save_time = time.time() – start
# ファイルサイズを比較
csv_size = os.path.getsize(‘large_data.csv’) / 1024 / 1024
parquet_size = os.path.getsize(‘large_data.parquet’) / 1024 / 1024
# 読み込み速度を比較
start = time.time()
df_csv = pd.read_csv(‘large_data.csv’)
csv_load_time = time.time() – start
start = time.time()
df_parquet = pd.read_parquet(‘large_data.parquet’)
parquet_load_time = time.time() – start
# 結果表示
print(“\n【保存時間】”)
print(f” CSV: {csv_save_time:.2f}秒”)
print(f” Parquet: {parquet_save_time:.2f}秒”)
print(“\n【ファイルサイズ】”)
print(f” CSV: {csv_size:.2f} MB”)
print(f” Parquet: {parquet_size:.2f} MB”)
print(f” 圧縮率: {(1 – parquet_size/csv_size)*100:.1f}%”)
print(“\n【読み込み時間】”)
print(f” CSV: {csv_load_time:.2f}秒”)
print(f” Parquet: {parquet_load_time:.2f}秒”)
print(f” Parquetは {csv_load_time/parquet_load_time:.1f}倍速い 🚀”)
【実行結果】
=== 100万件のデータを作成中… ===
データ件数: 1,000,000件
【保存時間】
CSV: 2.45秒
Parquet: 0.78秒
【ファイルサイズ】
CSV: 52.34 MB
Parquet: 8.67 MB
圧縮率: 83.4%
【読み込み時間】
CSV: 3.45秒
Parquet: 0.28秒
Parquetは 12.3倍速い 🚀
5-4. 特定の列だけ読み込む
# ===== 特定の列だけ読み込む(Parquetの強み)=====
# 必要な列だけ読み込む
df_selected = pd.read_parquet(‘large_data.parquet’, columns=[‘ID’, ‘金額’])
print(“=== 選択した列だけ読み込み ===”)
print(f”読み込んだ列: {list(df_selected.columns)}”)
print(df_selected.head())
【実行結果】
=== 選択した列だけ読み込み ===
読み込んだ列: [‘ID’, ‘金額’]
ID 金額
0 1 45678
1 2 23456
2 3 78901
3 4 12345
4 5 56789
💡 Parquetを使うべき場面
- 大量データ(10万件以上)を扱うとき
- 何度も読み書きするデータ
- データ型を保持したいとき
- ストレージ容量を節約したいとき
⚖️ 6. 形式の使い分け
6-1. 用途別の推奨形式
用途別の推奨ファイル形式
| 用途 |
推奨形式 |
理由 |
| レポート配布 |
Excel |
見栄えが良く、誰でも開ける |
| データ共有(外部) |
CSV |
汎用性が高く、どこでも使える |
| Web API連携 |
JSON |
階層構造を保持、標準形式 |
| 大量データ保存 |
Parquet |
高速、高圧縮、型保持 |
| 機械学習用データ |
Parquet |
高速読み込み、型情報保持 |
| バックアップ |
Parquet |
圧縮率が高く、型を保持 |
6-2. 複数形式で同時出力する関数
# ===== 複数形式で同時出力 =====
import os
def export_all_formats(df, base_filename):
“””データを複数形式で同時にエクスポート”””
print(f”=== エクスポート開始: {len(df):,}件 ===”)
# CSV
csv_file = f'{base_filename}.csv’
df.to_csv(csv_file, index=False, encoding=’utf-8-sig’)
csv_size = os.path.getsize(csv_file) / 1024
print(f”✅ CSV: {csv_file} ({csv_size:.1f} KB)”)
# Excel
excel_file = f'{base_filename}.xlsx’
df.to_excel(excel_file, index=False, sheet_name=’データ’)
excel_size = os.path.getsize(excel_file) / 1024
print(f”✅ Excel: {excel_file} ({excel_size:.1f} KB)”)
# JSON
json_file = f'{base_filename}.json’
df.to_json(json_file, orient=’records’, force_ascii=False, indent=2)
json_size = os.path.getsize(json_file) / 1024
print(f”✅ JSON: {json_file} ({json_size:.1f} KB)”)
# Parquet
parquet_file = f'{base_filename}.parquet’
df.to_parquet(parquet_file, index=False, compression=’snappy’)
parquet_size = os.path.getsize(parquet_file) / 1024
print(f”✅ Parquet: {parquet_file} ({parquet_size:.1f} KB)”)
print(“\n全形式でエクスポート完了!”)
# 使用例
export_all_formats(df, ‘products_all’)
【実行結果】
=== エクスポート開始: 5件 ===
✅ CSV: products_all.csv (0.2 KB)
✅ Excel: products_all.xlsx (5.1 KB)
✅ JSON: products_all.json (0.4 KB)
✅ Parquet: products_all.parquet (1.2 KB)
全形式でエクスポート完了!
📝 STEP 15 のまとめ
✅ このステップで学んだこと
- CSV:汎用的、軽量、encoding=’utf-8-sig’で文字化け防止
- Excel:レポート作成、複数シート、書式設定
- JSON:階層構造、API連携、orient=’records’が一般的
- Parquet:高速、高圧縮、大量データに最適
💡 形式選択の早見表
| 場面 |
推奨形式 |
| 人に配布する |
Excel / CSV |
| APIと連携する |
JSON |
| 大量データを保存する |
Parquet |
| プログラムで処理する |
Parquet / CSV |
🎯 次のステップの予告
次のSTEP 16では、「クラウドストレージへのロード」を学びます。
- AWS S3へのアップロード
- Google Cloud Storageへのアップロード
- パーティショニングの設計
📝 練習問題
問題 1
基礎
以下のDataFrameをCSVファイルに保存してください。(Excelで開いても文字化けしないように)
df = pd.DataFrame({
‘顧客名’: [‘田中太郎’, ‘佐藤花子’, ‘鈴木一郎’],
‘購入金額’: [15000, 25000, 10000]
})
# ここにコードを書いてください
【解答】
df.to_csv(‘customers.csv’, index=False, encoding=’utf-8-sig’)
print(“✅ CSVファイルを保存しました!”)
encoding=’utf-8-sig’で文字化けを防ぎます。
問題 2
基礎
以下の2つのDataFrameを、1つのExcelファイルの別々のシートに保存してください。
sales_df = pd.DataFrame({
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’],
‘売上’: [15000, 25000, 10000]
})
costs_df = pd.DataFrame({
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’],
‘原価’: [8000, 12000, 5000]
})
# ここにコードを書いてください
【解答】
with pd.ExcelWriter(‘report.xlsx’, engine=’openpyxl’) as writer:
sales_df.to_excel(writer, sheet_name=’売上’, index=False)
costs_df.to_excel(writer, sheet_name=’原価’, index=False)
print(“✅ 複数シートのExcelファイルを作成しました!”)
問題 3
基礎
DataFrameをJSONファイルに保存してください。(orient=’records’で)
df = pd.DataFrame({
‘商品名’: [‘りんご’, ‘バナナ’],
‘価格’: [150, 100]
})
# ここにコードを書いてください
【解答】
df.to_json(‘products.json’, orient=’records’, force_ascii=False, indent=2)
print(“✅ JSONファイルを保存しました!”)
問題 4
基礎
DataFrameをParquetファイルに保存してください。(圧縮方式: snappy)
df = pd.DataFrame({
‘ID’: range(1, 101),
‘データ’: np.random.randint(0, 1000, 100)
})
# ここにコードを書いてください
【解答】
df.to_parquet(‘data.parquet’, index=False, compression=’snappy’)
print(“✅ Parquetファイルを保存しました!”)
問題 5
応用
日付データを含むDataFrameをJSONファイルに保存してください。(日付は’YYYY-MM-DD’形式で)
df = pd.DataFrame({
‘日付’: pd.date_range(‘2024-01-01’, periods=5),
‘売上’: [10000, 15000, 12000, 18000, 20000]
})
# ここにコードを書いてください
【解答】
# 日付を文字列に変換
df[‘日付’] = df[‘日付’].dt.strftime(‘%Y-%m-%d’)
# JSONに保存
df.to_json(‘sales.json’, orient=’records’, force_ascii=False, indent=2)
print(“✅ 日付データを含むJSONファイルを保存しました!”)
問題 6
応用
CSVとParquetのファイルサイズを比較してください。(1万件のデータで)
【解答】
import numpy as np
import os
# 1万件のデータを作成
df = pd.DataFrame({
‘ID’: range(1, 10001),
‘名前’: [f’ユーザー{i}’ for i in range(1, 10001)],
‘金額’: np.random.randint(1000, 100000, 10000)
})
# CSV保存
df.to_csv(‘test.csv’, index=False, encoding=’utf-8-sig’)
csv_size = os.path.getsize(‘test.csv’) / 1024
# Parquet保存
df.to_parquet(‘test.parquet’, index=False, compression=’snappy’)
parquet_size = os.path.getsize(‘test.parquet’) / 1024
print(f”CSV: {csv_size:.1f} KB”)
print(f”Parquet: {parquet_size:.1f} KB”)
print(f”圧縮率: {(1 – parquet_size/csv_size)*100:.1f}%”)
問題 7
応用
Excelファイルにヘッダー行の書式設定(青背景・白文字・太字)を適用してください。
【解答】
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows
df = pd.DataFrame({
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’],
‘価格’: [150, 100, 80]
})
wb = Workbook()
ws = wb.active
for row in dataframe_to_rows(df, index=False, header=True):
ws.append(row)
# ヘッダー書式設定
header_fill = PatternFill(start_color=”4472C4″, end_color=”4472C4″, fill_type=”solid”)
header_font = Font(color=”FFFFFF”, bold=True)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
wb.save(‘styled.xlsx’)
print(“✅ 書式設定したExcelを保存しました!”)
問題 8
応用
データを5分割してCSVファイルに保存してください。(ファイル名: data_1.csv, data_2.csv, …)
df = pd.DataFrame({
‘ID’: range(1, 1001),
‘データ’: np.random.randint(0, 1000, 1000)
})
# 5分割して保存
# ここにコードを書いてください
【解答】
num_chunks = 5
chunk_size = len(df) // num_chunks
for i in range(num_chunks):
start_idx = i * chunk_size
if i == num_chunks – 1:
chunk = df[start_idx:] # 最後は残り全部
else:
chunk = df[start_idx:start_idx + chunk_size]
filename = f’data_{i+1}.csv’
chunk.to_csv(filename, index=False, encoding=’utf-8-sig’)
print(f”{filename}: {len(chunk)}件”)
問題 9
発展
データをCSV、Excel、JSON、Parquetの4形式で同時に保存する関数を作成してください。
【解答】
import os
def export_all_formats(df, base_name):
“””データを全形式でエクスポート”””
results = {}
# CSV
df.to_csv(f'{base_name}.csv’, index=False, encoding=’utf-8-sig’)
results[‘CSV’] = os.path.getsize(f'{base_name}.csv’) / 1024
# Excel
df.to_excel(f'{base_name}.xlsx’, index=False)
results[‘Excel’] = os.path.getsize(f'{base_name}.xlsx’) / 1024
# JSON
df.to_json(f'{base_name}.json’, orient=’records’, force_ascii=False, indent=2)
results[‘JSON’] = os.path.getsize(f'{base_name}.json’) / 1024
# Parquet
df.to_parquet(f'{base_name}.parquet’, compression=’snappy’)
results[‘Parquet’] = os.path.getsize(f'{base_name}.parquet’) / 1024
for fmt, size in results.items():
print(f”✅ {fmt}: {size:.1f} KB”)
return results
# 使用例
df = pd.DataFrame({‘ID’: range(1, 101), ‘データ’: np.random.randint(0, 1000, 100)})
export_all_formats(df, ‘output’)
問題 10
発展
エクスポート処理のログを記録する関数を作成してください。(成功/失敗、ファイルサイズ、所要時間を記録)
【解答】
import time
import os
import logging
logging.basicConfig(
level=logging.INFO,
format=’%(asctime)s – %(levelname)s – %(message)s’
)
def export_with_log(df, filename, format_type=’csv’):
“””ログ付きでデータをエクスポート”””
logger = logging.getLogger(__name__)
logger.info(f”エクスポート開始: {filename} ({len(df)}件)”)
start = time.time()
try:
if format_type == ‘csv’:
df.to_csv(filename, index=False, encoding=’utf-8-sig’)
elif format_type == ‘excel’:
df.to_excel(filename, index=False)
elif format_type == ‘json’:
df.to_json(filename, orient=’records’, force_ascii=False, indent=2)
elif format_type == ‘parquet’:
df.to_parquet(filename, compression=’snappy’)
elapsed = time.time() – start
size = os.path.getsize(filename) / 1024
logger.info(f”✅ 成功: {filename} ({size:.1f} KB, {elapsed:.2f}秒)”)
return True
except Exception as e:
logger.error(f”❌ 失敗: {filename} – {e}”)
return False
# 使用例
df = pd.DataFrame({‘ID’: range(1, 101), ‘データ’: np.random.randint(0, 1000, 100)})
export_with_log(df, ‘test.csv’, ‘csv’)
export_with_log(df, ‘test.parquet’, ‘parquet’)