0Pricing
Pandas & NumPy Academy · レッスン

DataFrameのファイルへの書き出し

to_csvとto_excelを使って整形済みのDataFrameをCSVやExcelへ出力し、インデックスと浮動小数点数の形式を制御します。

「DataFrameのファイルへの書き出し」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

エクスポートが重要な理由

データ分析がPythonの中だけで完結することはほとんどありません。関係者とクリーンアップ済みのデータセットを共有したり、結果を他のツールに渡したり、再現性のために処理済みデータを保存したりする必要があります。Pandasにはto_csv()、to_excel()、to_json()、to_parquet()が用意されており、読み込み関数と対応し、多くの同じ設定パラメーターを受け取ります。

import pandas as pd

df = pd.DataFrame({'name': ['A', 'B'], 'score': [90, 75]})
df.to_csv('results.csv')
df.to_excel('results.xlsx')
df.to_json('results.json', orient='records')

to_csv():インデックスの落とし穴

デフォルトでは、to_csv()は行インデックスを最初の列として書き込むため、ファイルを読み戻したときにunnamed: 0列が作成されます。インデックスを省略するにはindex=Falseを渡してください。インデックス自体が日付のような意味のあるデータでない限り、ほぼ常にこれが適切です。意図的にインデックスを含める理由がない限り、必ずindex=Falseを指定してください。

import pandas as pd

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})

# Include index (default -- creates 'Unnamed: 0' when re-read)
df.to_csv('with_index.csv')

# Exclude index (recommended)
df.to_csv('clean.csv', index=False)

区切り文字とエンコーディングを制御する

sep=を渡すと、タブ区切りまたはセミコロン区切りのファイルを書き込めます。encoding=を使うと、UTF-8などの文字セットを指定できます。アクセント記号や漢字など、列の値にASCII以外の文字が含まれる場合に不可欠です。encoding='utf-8-sig'を指定するとBOM(バイト順マーク)が追加され、Windows上のExcelとの互換性が向上します。

import pandas as pd

df = pd.DataFrame({'name': ['Müller', 'Tanaka'], 'val': [1, 2]})
# Tab-separated, UTF-8
df.to_csv('output.tsv', sep='\t', encoding='utf-8', index=False)

# Excel-compatible UTF-8 with BOM
df.to_csv('for_excel.csv', encoding='utf-8-sig', index=False)

浮動小数点数の書式を制御する

デフォルトでは、Pandasは浮動小数点数を完全な精度で書き込みます。float_format='%.2f'を使うと小数点以下2桁に制限できます。余分な小数桁が人の目には不自然に見える財務データで重要です。na_rep='NULL'またはna_rep=''を渡すと、出力ファイルでNaN値をどのように書き込むかを制御できます。

import pandas as pd
import numpy as np

df = pd.DataFrame({'price': [9.99, np.nan, 14.123456],
                   'qty': [1, 2, 3]})
df.to_csv('prices.csv',
          index=False,
          float_format='%.2f',
          na_rep='N/A')

to_excel():シートへの書き込み

df.to_excel('file.xlsx', sheet_name='Data', index=False)は、DataFrameをExcelブックに書き込みます。to_csv()と同様に、インデックスに意味がない限りindex=Falseを設定してください。startrow=とstartcol=のパラメーターを使うと、シート内で表を配置する位置を指定できます。データの上にタイトル行を追加する場合などに便利です。

import pandas as pd

df = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
df.to_excel('report.xlsx',
            sheet_name='Sales',
            index=False,
            startrow=1)  # leave row 0 for a title

ExcelWriterで複数のシートに書き込む

同じブック内の別々のシートに複数のDataFrameを書き込むには、pd.ExcelWriterをコンテキストマネージャーとして使います。withブロック内で、各DataFrameに対してdf.to_excel(writer, sheet_name='Name')を呼び出します。コンテキストを抜けると、ブックが確定して保存されます。これにより、関連する表ごとに複数のファイルを作成せずに済みます。

import pandas as pd

df1 = pd.DataFrame({'a': [1, 2]})
df2 = pd.DataFrame({'b': [3, 4]})

with pd.ExcelWriter('multi_sheet.xlsx', engine='openpyxl') as writer:
    df1.to_excel(writer, sheet_name='Sheet1', index=False)
    df2.to_excel(writer, sheet_name='Sheet2', index=False)

to_json():JSONへのエクスポート

df.to_json()はDataFrameをJSONにシリアライズします。orient=パラメーターはread_jsonと対応しています。行の辞書のリストには'records'(最も相互運用性が高い)、列配列の辞書には'columns'、行ラベルをキーとする辞書には'index'を使います。人が読みやすい形式にするにはindent=2を渡してください。

import pandas as pd

df = pd.DataFrame({'name': ['A', 'B'], 'score': [90, 75]})
print(df.to_json(orient='records', indent=2))
# [
#   {"name": "A", "score": 90},
#   {"name": "B", "score": 75}
# ]

既存ファイルへの追記

既存のCSVを上書きせずに行を追記するには、mode='a'でファイルを追記モードで開き、ヘッダー行が重複しないようにheader=Falseを設定します。Excelの場合は、mode='a'を指定したExcelWriterを使います。大規模なストリーミングパイプラインでは、チャンク単位で追記し、ヘッダーは最初のチャンクでのみ書き込みます。

import pandas as pd

df_new = pd.DataFrame({'a': [5, 6], 'b': [7, 8]})
# Append to existing file, skip writing header
df_new.to_csv('existing.csv',
              mode='a',
              header=False,
              index=False)

エクスポート前に列を選択する

エクスポート前に、受け取り手が必要とする列だけを選択し、行を論理的な順序に並べ替えるのがよい習慣です。これにより出力ファイルが整理され、内部ID、エンコード済みの特徴量、デバッグフラグなどの内部列を誤って漏えいするのを防げます。書き込み前の同じパイプライン式で、ブラケット記法による選択とsort_values()を使います。

import pandas as pd

df = pd.DataFrame({'id': [3,1,2],
                   'name': ['C','A','B'],
                   '_internal': [9,7,8]})

(df[['id', 'name']]
   .sort_values('id')
   .to_csv('export.csv', index=False))

書き込んだファイルを検証する

書き込み後は必ずファイルを読み戻し、shape、列名、いくつかの値を確認してください。CIパイプラインではチェックサムを比較します。重要な財務エクスポートでは、集計値が一致することをアサートしてください。これにより、ファイルが後続の利用者に渡る前に、エンコーディングの問題、浮動小数点精度の損失、インデックスの問題を検出できます。

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
df.to_csv('/tmp/check.csv', index=False)

df_check = pd.read_csv('/tmp/check.csv')
assert df_check.shape == df.shape, 'Row/column count mismatch'
assert list(df_check.columns) == list(df.columns)
print('Export verified OK')

データ形式としてのParquet:より優れた選択肢

大規模な分析用データセットでは、CSVの代わりにParquet形式を検討してください。Parquetはデータを列指向形式で保存し、圧縮に対応し、データ型を正確に保持します。また、分析クエリでは読み込みが10~100倍高速です。df.to_parquet('data.parquet')で書き込み、pd.read_parquet('data.parquet')で読み込みます。使用するにはpyarrowまたはfastparquetのインストールが必要です。

import pandas as pd

df = pd.DataFrame({'a': range(1000000), 'b': range(1000000)})
df.to_parquet('data.parquet', index=False)

df2 = pd.read_parquet('data.parquet')
print(df2.dtypes)  # dtypes preserved exactly

クイックチェック

このレッスンで学んだ、DataFrameをファイルに書き込む方法の理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、次のことを学びました。to_csv()とto_excel()はDataFrameをエクスポートし、どちらもデフォルトではインデックスを含めるため、整った出力にするには必ずindex=Falseを設定します。ExcelWriterを使うと、1つのワークブック内の別々のシートに複数のDataFrameを書き込めます。また、Parquetは大規模な分析用データセットにおいて、CSVより高速で容量効率にも優れた代替形式です。次は、URLからリモートCSVファイルを読み込み、io.StringIOを使ってメモリ上のCSV文字列を解析します。

よくある質問

「DataFrameのファイルへの書き出し」レッスンは無料ですか?

はい。「DataFrameのファイルへの書き出し」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「DataFrameのファイルへの書き出し」で何を学びますか?

to_csvとto_excelを使って整形済みのDataFrameをCSVやExcelへ出力し、インデックスと浮動小数点数の形式を制御します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「DataFrameのファイルへの書き出し」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CSVファイルの読み込み
  2. ExcelとJSONファイルの読み込み
  3. DataFrameのファイルへの書き出し
  4. URLとStringIOからの読み込み
← Pandas & NumPy Academyに戻る