こんにちは!ぼりたそです!
今回は、pandasを使ってCSV・Excelファイルを読み込み、処理結果を保存する方法を解説します。
「CSVを読み込むと先頭の行が消える」「保存したCSVに余分な列が増える」「ファイルが見つからない」といった疑問も、具体例を使って解消していきます。手元にデータがない方でも試せるように、サンプルCSVの作成から始めます。
この記事で学べること
read_csv()・read_excel()によるファイルの読み込みto_csv()・to_excel()によるファイルの保存- ヘッダー、インデックス、文字コード、シート名の指定
- ファイルパスや読み込みエラーの確認方法
Pythonの基本文法を理解していれば、NumPyの知識は必要ありません。
CSV・ExcelとDataFrameの関係

CSVとExcelはパソコンに保存されるファイル、DataFrameはPythonの実行中に操作する表形式のデータです。
CSVを読み込むときはpd.read_csv()、Excelを読み込むときはpd.read_excel()を使います。読み込んだDataFrameで列を追加したり、値を変更したりしても、元のファイルは自動では変更されません。変更後のデータを残したい場合は、to_csv()やto_excel()で保存します。
主な関数を整理すると、次のとおりです。
| 操作 | CSV | Excel(.xlsx) |
|---|---|---|
| 読み込む | pd.read_csv() | pd.read_excel() |
| 保存する | df.to_csv() | df.to_excel() |
| よく使う指定 | encoding、header | sheet_name、header |
CSVは通常、1つの表をテキストで保存します。一方、Excelは1つのファイルに複数のシートを持てる点が違います。
CSVファイルを作成して読み込む

CSV(Comma-Separated Values)は、値をカンマで区切るテキスト形式です。例えば、売上を記録したCSVは次のようになります。
商品,単価,個数
ペン,120,2
ノート,250,1
消しゴム,180,31行目が列名(ヘッダー)、2行目以降がデータです。ここではPythonのopen()を使ってファイルを作り、そのファイルをpandasで読み込みます。
import pandas as pd
csv_text = """商品,単価,個数
ペン,120,2
ノート,250,1
消しゴム,180,3
"""
with open("practice_sales.csv", "w", encoding="utf-8") as f:
f.write(csv_text)
df = pd.read_csv("practice_sales.csv", encoding="utf-8")
print(df)
print(df.shape)
# 実行結果:
# 商品 単価 個数
# 0 ペン 120 2
# 1 ノート 250 1
# 2 消しゴム 180 3
# (3, 3)コードの流れを確認しましょう。
csv_text = ...:CSVとして保存する文字列を変数に入れます。この段階では、まだファイルはありません。open(..., "w", encoding="utf-8"):書き込み用にファイルを開きます。指定した名前のファイルがなければ作成します。f.write(csv_text):用意した文字列をファイルに書き込みます。pd.read_csv(...):保存済みのCSVを読み込み、DataFrameを作成します。
withブロックを抜けるとファイルは閉じられます。なお、"w"は既存の同名ファイルがあれば内容を上書きするため、別の大切なファイル名を指定しないでください。
print(df.shape)が(3, 3)になっているのは、データが3行3列あるためです。CSVの先頭行は列名として使われるので、データの行数には含まれません。
to_csv()でCSVファイルを保存する
次はDataFrameをCSVとして保存してみましょう。
import pandas as pd
df = pd.DataFrame({
"商品": ["ペン", "ノート", "消しゴム"],
"単価": [120, 250, 180],
"個数": [2, 1, 3]
})
df.to_csv("saved_sales.csv", index=False, encoding="utf-8-sig")
restored = pd.read_csv("saved_sales.csv", encoding="utf-8-sig")
print(restored.columns.tolist())
print(restored.shape)
# 実行結果:
# ['商品', '単価', '個数']
# (3, 3)to_csv()は保存先のファイル名を指定するだけでも使えますが、初心者のうちは**index=Falseを明示する**のがおすすめです。
DataFrameの左端に表示される0、1、2は行ラベル(インデックス)です。to_csv()は初期設定でこの行ラベルも保存します。そのため、必要のないインデックスを保存すると、再び読み込んだときにUnnamed: 0のような余分な列ができることがあります。

index=Falseにすると行ラベルを出力せず、列名とデータだけを保存できます。**列名を保存するかどうかはheader、行ラベルを保存するかどうかはindex**で決まるため、混同しないようにしましょう。
また、encoding="utf-8-sig"はUTF-8にBOMという識別用の情報を付ける設定です。Windows版ExcelでCSVを開くときの日本語文字化け対策として役立つ場合があります。Python中心で扱うCSVなら、通常のutf-8もよく使われます。
ヘッダーのないCSVファイルを読み込む

CSVによっては、1行目に列名(ヘッダー)がなく、最初からデータが並んでいることもあります。この場合、read_csv()の初期設定のままだと、最初のデータが列名として扱われてしまいます。
import pandas as pd
with open("no_header_sales.csv", "w", encoding="utf-8") as f:
f.write("ペン,120\nノート,250\n")
df = pd.read_csv(
"no_header_sales.csv",
header=None,
names=["商品", "単価"],
encoding="utf-8"
)
print(df)
# 実行結果:
# 商品 単価
# 0 ペン 120
# 1 ノート 250header=Noneは「列名の行はない」という指定です。names=[...]は、自分で列名を付ける指定になります。
反対に、元のCSVにヘッダーがある場合は、通常のread_csv()で問題ありません。先頭の行が列名なのか、実際のデータなのかを確認することが大切です。
インデックスに意味がある場合は保存して読み戻す
商品IDなど、行ラベルそのものに意味がある場合は、index=Falseで消さずに保存できます。
import pandas as pd
df = pd.DataFrame({"単価": [120, 250]}, index=["S1", "S2"])
df.to_csv("sales_with_id.csv", index_label="商品ID", encoding="utf-8")
restored = pd.read_csv(
"sales_with_id.csv", index_col="商品ID", encoding="utf-8"
)
print(restored.index.tolist())
print(restored["単価"].tolist())
# 実行結果:
# ['S1', 'S2']
# [120, 250]保存時のindex_label="商品ID"は、行ラベルをCSVに書き込む際の列名です。一方、読み込み時のindex_col="商品ID"は、その列を行ラベルとして使う指定です。
index=Falseはいつでも正しいわけではありません。行ラベルが単なる連番か、データとして残すべきIDかで判断してください。
Excelファイルの読み込みと保存

Excelの.xlsxファイルも、基本的にはCSVと同じ流れで読み書きできます。.xlsxを扱うには、Excelファイルを処理する追加ライブラリopenpyxlなどが必要です。未導入の場合はターミナルで次を実行します。
python -m pip install pandas openpyxlここではDataFrameをExcelファイルとして保存し、同じファイルを読み戻します。
import pandas as pd
df = pd.DataFrame({
"商品": ["ペン", "ノート", "消しゴム"],
"単価": [120, 250, 180],
"個数": [2, 1, 3]
})
df.to_excel(
"saved_sales.xlsx", sheet_name="売上", index=False, engine="openpyxl"
)
restored = pd.read_excel(
"saved_sales.xlsx", sheet_name="売上", engine="openpyxl"
)
print(restored)
# 実行結果:
# 商品 単価 個数
# 0 ペン 120 2
# 1 ノート 250 1
# 2 消しゴム 180 3sheet_name="売上"は、保存先または読み込み先のシート名を指定します。読み込みで省略すると、通常は最初のシートが使われます。別のシートにデータがある場合は、実際のシート名を指定しましょう。
なお、to_excel()はDataFrameの内容を書き出すための機能です。既存Excelファイルのグラフ・書式・数式を完全に保ったまま編集する機能ではありません。大切な元ファイルは別名で保存するようにしてください。
ファイルパスと保存先の確認

pd.read_csv("practice_sales.csv")のようにファイル名だけを書くと、Pythonの現在の作業フォルダが基準になります。Notebookを保存したフォルダと必ずしも一致しないので、場所を確認してみましょう。
from pathlib import Path
path = Path("practice_sales.csv")
if not path.exists():
path.write_text("商品,単価,個数\nペン,120,2\n", encoding="utf-8")
print(Path.cwd()) # 現在の作業フォルダ。表示内容は環境によって異なります
print(path.exists())
# 実行結果(2行目):
# TruePath.cwd()で現在の作業フォルダがわかり、path.exists()で指定したファイルが存在するかを確認できます。例えば、別のフォルダにあるCSVはpd.read_csv("data/sales.csv")のようにフォルダも指定します。
Windowsならr"C:\data\sales.csv"、macOSなら"/Users/ユーザー名/data/sales.csv"のように、保存場所まで含めた絶対パスも指定できます。保存先のフォルダ自体が存在しない場合は、事前に作成が必要です。
よくあるエラーと対処方法
| 状況 | 主な原因と確認ポイント |
|---|---|
FileNotFoundError | ファイル名・拡張子・作業フォルダ・パスが正しいか |
UnicodeDecodeError | 保存元の文字コードとencodingが合っているか |
Unnamed: 0列ができる | 保存時に不要なインデックスを書き出していないか |
| 1行目のデータが列名になる | ヘッダーの有無とheader=Noneの指定 |
| 日本語のCSVがExcelで文字化けする | 保存時のencoding="utf-8-sig"を検討 |
| 商品IDの先頭の0が消える | dtype={"商品ID": "string"}などで文字列として読む |
文字コードは、UTF-8のほかに、Windowsで作られたCSVでcp932が使われる場合もあります。UnicodeDecodeErrorが出たときは、まずファイルの作成元の設定を確認してください。文字コードは適当に切り替えれば必ず解決するものではありません。
数字のように見える商品IDも、計算する数値ではなく識別用の文字列として扱う方が適切な場合があります。例えば、0012というIDをそのまま残すには、読み込み時にdtype={"商品ID": "string"}を指定します。
import pandas as pd
with open("product_ids.csv", "w", encoding="utf-8") as f:
f.write("商品ID,商品\n0012,ペン\n0034,ノート\n")
df = pd.read_csv("product_ids.csv", dtype={"商品ID": "string"})
print(df["商品ID"].tolist())
# 実行結果:
# ['0012', '0034']読み込み後はhead()で先頭行、shapeで行数と列数、columnsで列名を確認すると、取り込みミスに気づきやすくなります。SeriesやDataFrameの基本構造は、以下の記事を参照いただければと思います。
参考:pandas公式ドキュメント「How do I read and write tabular data?」
pandas入門書の紹介
ここまで、CSVやExcelを読み込んで保存する方法を解説しました。実際のデータ分析では、この間に条件抽出、欠損値処理、列の計算、グループ別集計などの操作を組み合わせます。
Kindle書籍『機械学習・データ分析のためのpandas入門 ― データ加工と集計の基本をPythonで学ぶ ―』(著者:ぼりたそ)では、Series・DataFrameの基礎からCSVの読み込み、加工、集計、データ結合までを、図解とPythonコード、演習を通して順番に学べます。
「ファイルは読み込めたけれど、その後に何をすればいいのかわからない」という方にも、操作のつながりを理解しながら学習できる一冊です。
まとめ
- CSVは
read_csv()・to_csv()、Excelはread_excel()・to_excel()で読み書きします。 - 読み込み後のDataFrameを変更しても、元ファイルは自動では変更されません。
- 不要な行ラベルを保存しない場合は
index=Falseを指定します。 - ヘッダー、文字コード、シート名、ファイルパスは実際のファイルに合わせて指定します。
- 保存後のファイルを再度読み込み、列名や行数が意図どおりか確認すると安心です。



