HOWTO · Pandas
Pandas の CSV に追加する
このチュートリアルでは、追加モードで to_csv()を使用して既存の CSV ファイルにデータを追加する方法を示します。
このページの内容
Pandas の to_csv() と mode="a" を使うと、CSV ファイルにすでにある行の後ろへ DataFrame の行を追加できます。追記モードでは既存のファイル内容が保持されます。ファイルにヘッダーがある場合は header=False を指定し、DataFrame のインデックスを余分な CSV 列として出力しない場合は index=False を指定します。
既存の CSV ファイルに DataFrame を追記する
この例では、最初に CSV を作成し、2つ目の DataFrame を追記します。自分のコードでは、対象の CSV ファイルのパスを指定してください。追記する列は、既存の CSV の列と同じ順序にします。CSV ファイルには、列名をもとに値を自動で並べ替えるスキーマが保存されていません。
この変更不可のコード例では、列名とサンプル値が英語のまま表示されます。
次の例を実行します。
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as directory:
path = Path(directory) / "records.csv"
original = pd.DataFrame({"name": ["Ava"], "score": [8]})
added = pd.DataFrame({"name": ["Noah"], "score": [9]})
original.to_csv(path, index=False)
added.to_csv(path, mode="a", header=False, index=False)
print(path.read_text(), end="")
最初の書き込みでファイルとヘッダーが作成されます。2回目は mode="a" を使って末尾に行を追加します。header=False により列名の重複を防ぎ、index=False により Pandas が行インデックスを追加しないようにします。最終的なファイルには、元の行の後ろに追加した行が入ります。変更不可の例に含まれる列名とサンプル値(Ava と Noah)は英語のままです。DataFrame のインデックスも列として含める場合は index=False を省略し、CSV を読み込む際にその列を考慮してください。
CSV ファイルが空の場合にだけヘッダーを書き込む
出力先が空、またはまだ存在しない可能性がある場合は、追記モードで開いて現在のファイル位置を確認します。存在しないパスを mode="a" で開くと、ファイルが作成されます。tell() の呼び出しは現在位置を返します。追記モードで開いた直後の位置が 0 なら、ファイルは空です。その場合にだけヘッダーを書き込みます。
このセクションのコードと表示されるラベルや出力は英語のままです。
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as directory:
path = Path(directory) / "records.csv"
rows = pd.DataFrame({"name": ["Mia"], "score": [7]})
with path.open("a", encoding="utf-8", newline="") as csv_file:
write_header = csv_file.tell() == 0
rows.to_csv(csv_file, header=write_header, index=False)
この方法なら、新しいファイルと既存の CSV の両方に対応できます。新規作成されたファイルまたは空のファイルには列名が書き込まれ、内容のあるファイルには新しい行だけが追加されます。変更不可の例に含まれる列名とサンプル値(name、score、Mia)は英語のままです。追記するたびに列の順序を同じにし、フィールドの構成にも互換性を持たせてください。同じファイルを複数の書き込み処理が同時に更新する可能性がある場合は、ヘッダーの確認と行の書き込みが別の処理と割り込んで実行されないよう、書き込みを調整してください。
追記した行を確認し、よくある間違いを避ける
内容を確かめたい場合は、書き込み後に CSV を読み取ります。最初の例では、ファイルにヘッダーが1つあり、その後に元のレコードと追記したレコードが続きます。print(path.read_text(), end="") は、実行するとファイルの内容をそのまま選択可能なテキストとして表示します。変更不可の例に含まれる列名とサンプル値は英語のままです。
例を自分の用途に合わせるときは、次の点を確認してください。
- 追記する DataFrame の列は、CSV の列と同じ順序で対応させます。Pandas は値を位置に基づいて書き込み、追記時に列名で CSV の列と照合することはありません。
- ヘッダーのある空でないファイルには
header=Falseを指定します。ヘッダーを重ねて書くと、読み込み時に通常のデータ行として扱われます。 - 行インデックスをデータに含めない場合は
index=Falseを指定します。含める場合は、ファイルの構成にインデックス列を含め、その列も考慮してください。 - 追記モードはファイル末尾にテキストを追加します。列、区切り文字、エンコーディングの不一致を検証したり修正したりはしません。既存の CSV と同じ設定を使ってください。
- ファイルが空の場合は、最初のデータ行より前にヘッダーを1度書き込みます。上の
tell()による確認では、追記モードで開いたファイルの位置を使って判断します。
手早く確認するには、Python で pd.read_csv(path) を使って出力ファイルを読み込み、行と列名を調べます。これにより、ディスクに書き込まれたテキストだけでなく、読み込み後のテーブルも確認できます。