Pandas df.to_csv() 関数
to_csv()DataFrameのメソッドで、データをCSV(カンマ区切り値)形式のファイルにエクスポートするために使用します。
CSVは最もよく使われるデータエクスポート形式の1つで、プレーンテキスト形式で表形式データを格納し、互換性が高く、ほぼすべてのデータ分析ツールで読み取ることができます。to_csv()機能が豊富で、区切り文字、エンコーディング方式、インデックス処理などのオプションをカスタマイズでき、さまざまなエクスポート要件を満たすことができます。
基本構文とパラメータ
構文形式
DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None,
columns=None, header=True, index=True, index_label=None,
mode='w', encoding=None, quoting=None, quotechar='"',
line_terminator=None, chunksize=None, date_format=None,
doublequote=True, escapechar=None, ...)
パラメータの説明
| パラメータ | 型 | 説明 | デフォルト値 |
|---|---|---|---|
| path_or_buf | str, path object, file-like object | ファイルパス、Noneの場合は文字列を返す | None |
| sep | str | フィールド区切り文字 | ',' |
| na_rep | str | 欠損値の表現 | '' |
| float_format | str | 浮動小数点数形式 | None |
| columns | list | エクスポートする列を指定 | None |
| header | bool, list | 列名をエクスポートするかどうか | True |
| index | bool | インデックスをエクスポートするかどうか | True |
| index_label | str | インデックス列の名前 | None |
| mode | str | 書き込みモード:'w' 上書き、'a' 追記 | 'w' |
| encoding | str | ファイルエンコーディング | None |
戻り値
- 戻り値の型:
None或str - ファイルパスを指定した場合、ファイルに書き込み、Noneを返します。
- 当
path_or_buf=None場合、CSV形式の文字列を返します。
例
以下の例を通して、全面的に習得しましょうto_csv()のさまざまな使い方。
例1:基本の使い方 - CSVファイルへのエクスポート
まずDataFrameを作成し、次にto_csv()を使用してCSVファイルにエクスポートします。
例
import pandas as pd
# サンプルのDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'],
'salary': [8000, 12000, 15000, 7000]
}
df = pd.DataFrame(data)
# 例1a:最も基本的なエクスポート
# path_or_buf: ファイルパス(必須パラメータはファイルパス、ここでNoneに設定すると文字列を返す)
csv_string = df.to_csv() # パスを指定しない場合、文字列を返す
print("返されたCSV文字列:")
print(csv_string)
print()
# ファイルにエクスポート
# デフォルトではインデックスと列名が含まれる
df.to_csv('output_basic.csv', index=False) # index=False インデックスをエクスポートしない
print("output_basic.csv にエクスポートしました")
# 読み込み検証
df_check = pd.read_csv('output_basic.csv')
print("n読み込みの検証:")
print(df_check)
# サンプルのDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'],
'salary': [8000, 12000, 15000, 7000]
}
df = pd.DataFrame(data)
# 例1a:最も基本的なエクスポート
# path_or_buf: ファイルパス(必須パラメータはファイルパス、ここでNoneに設定すると文字列を返す)
csv_string = df.to_csv() # パスを指定しない場合、文字列を返す
print("返されたCSV文字列:")
print(csv_string)
print()
# ファイルにエクスポート
# デフォルトではインデックスと列名が含まれる
df.to_csv('output_basic.csv', index=False) # index=False インデックスをエクスポートしない
print("output_basic.csv にエクスポートしました")
# 読み込み検証
df_check = pd.read_csv('output_basic.csv')
print("n読み込みの検証:")
print(df_check)
実行結果の予想:
返回的 CSV 字符串:
,name,age,city,salary
0,Tom,28,Beijing,8000
1,Jerry,35,Shanghai,12000
2,Mike,42,Guangzhou,15000
3,Lucy,26,Shenzhen,7000
已导出到 output_basic.csv
验证读取:
name age city salary
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
2 保存 Mike 42 Guangzhou 15000
3 Lucy 26 Shenzhen 7000
コードの解説:
to_csv()デフォルトではインデックス(最初の列には列名がない)と列名がエクスポートされます。- 設定
index=Falseによりインデックスをエクスポートしないようにでき、これによりインポート時により便利です。 - パスを指定しない場合、CSV形式の文字列を返します。
例2:区切り文字と形式のカスタマイズ
CSVファイルでは異なる区切り文字を使用でき、数値や欠損値の形式もカスタマイズできます。
例
import pandas as pd
# 欠損値と浮動小数点数を含むDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, None], # 欠損値
'score': [85.5, 92.3, 78.9, 95.0],
'city': ['Beijing', 'Shanghai', None, 'Shenzhen']
}
df = pd.DataFrame(data)
# 例2a:セミコロン区切り文字を使用
df.to_csv('output_semicolon.csv', sep=';', index=False)
print("セミコロン区切り文字でエクスポート:")
with open('output_semicolon.csv', 'r') as f:
print(f.read())
print()
# 例2b:欠損値の表現をカスタマイズ
df.to_csv('output_na.csv', index=False, na_rep='N/A')
print("欠損値の表現をカスタマイズ:")
with open('output_na.csv', 'r') as f:
print(f.read())
print()
# 例2c:浮動小数点数のフォーマット
# float_format は Python のフォーマット文字列を使用
df.to_csv('output_float.csv', index=False, float_format='%.2f')
print("浮動小数点数のフォーマット:")
with open('output_float.csv', 'r') as f:
print(f.read())
print()
# 例2d:一部の列をエクスポート
df.to_csv('output_columns.csv', index=False, columns=['name', 'score'])
print("指定した列をエクスポート:")
with open('output_columns.csv', 'r') as f:
print(f.read())
# 欠損値と浮動小数点数を含むDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, None], # 欠損値
'score': [85.5, 92.3, 78.9, 95.0],
'city': ['Beijing', 'Shanghai', None, 'Shenzhen']
}
df = pd.DataFrame(data)
# 例2a:セミコロン区切り文字を使用
df.to_csv('output_semicolon.csv', sep=';', index=False)
print("セミコロン区切り文字でエクスポート:")
with open('output_semicolon.csv', 'r') as f:
print(f.read())
print()
# 例2b:欠損値の表現をカスタマイズ
df.to_csv('output_na.csv', index=False, na_rep='N/A')
print("欠損値の表現をカスタマイズ:")
with open('output_na.csv', 'r') as f:
print(f.read())
print()
# 例2c:浮動小数点数のフォーマット
# float_format は Python のフォーマット文字列を使用
df.to_csv('output_float.csv', index=False, float_format='%.2f')
print("浮動小数点数のフォーマット:")
with open('output_float.csv', 'r') as f:
print(f.read())
print()
# 例2d:一部の列をエクスポート
df.to_csv('output_columns.csv', index=False, columns=['name', 'score'])
print("指定した列をエクスポート:")
with open('output_columns.csv', 'r') as f:
print(f.read())
実行結果の予想:
使用分号分隔符导出:
name;age;score;city
Tom;28;85.5;Beijing
Jerry;35;92.3;Shanghai
Mike;42;78.9;Guangzhou
Lucy;;95;Shenzhen
自定义缺失值表示:
name,age,score,city
Tom,28,85.5,Beijing
Jerry,35,92.3,Shanghai
Mike,42,78.9,Guangzhou
Lucy,N/A,95.0,N/A
格式化浮点数:
name,age,score,c列
Tom,28,85.50,Beijing
Jerry,35,92.30,Shanghai
Mike,42,78.90,encoding
Lucy,,95.00,Shenzhen
导出指定列:
name,score
Tom,85.5
Jerry,92.3
自定义分隔符 78.9
Lucy,95.0
コードの解説:
sepパラメータで任意の区切り文字(セミコロン、タブなど)を指定できます。na_repパラメータで欠損値の文字列表現をカスタマイズします。デフォルトは空文字列です。float_formatパラメータはPythonのフォーマット文字列構文を使用します。columnsパラメータは指定した列のみをエクスポートします。
例3:インデックスとエンコーディングの処理
インデックスの処理とファイルエンコーディングは、エクスポート時の一般的な要件です。
例
import pandas as pd
# インデックス付きのDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
}
df = pd.DataFrame(data)
df.index = ['A001', 'A002', 'A003', 'A004'] # インデックスを設定
# 例3a:インデックスをエクスポートし、インデックス列名を指定
df.to_csv('output_index.csv', index=True, index_label='user_id')
print("インデックスとインデックス列名付き:")
with open('output_index.csv', 'r') as f:
print(f.read())
print()
# 例3b:列名をエクスポートしない
df.to_csv('output_no_header.csv', header=False, index=False)
print("列名をエクスポートしない:")
with open('output_no_header.csv', 'r') as f:
print(f.read())
print()
# 例3c:UTF-8エンコーディングを使用(中国語対応)
df_cn = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [28, 35, 42],
'城市': ['北京', '上海', '广州']
})
df_cn.to_csv('output_utf8.csv', index=False, encoding='utf-8-sig') # utf-8-sig はExcelでのオープンをサポート
print("UTF-8エンコーディング(中国語含む):")
with open('output_utf8.csv', 'r', encoding='utf-8-sig') as f:
print(f.read())
print()
# 例3d:追記モード
# まずファイルを作成し、その後データを追記
df.to_csv('output_append.csv', index=False)
# さらにデータを追記
df_append = pd.DataFrame({
'name': ['John', 'Mary'],
'age': [30, 27],
'city': ['Hangzhou', 'Nanjing']
})
df_append.to_csv('output_append.csv', index=False, mode='a', header=False)
print("追記モード:")
with open('output_append.csv', 'r') as f:
print(f.read())
# インデックス付きのDataFrameを作成
data = {
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
}
df = pd.DataFrame(data)
df.index = ['A001', 'A002', 'A003', 'A004'] # インデックスを設定
# 例3a:インデックスをエクスポートし、インデックス列名を指定
df.to_csv('output_index.csv', index=True, index_label='user_id')
print("インデックスとインデックス列名付き:")
with open('output_index.csv', 'r') as f:
print(f.read())
print()
# 例3b:列名をエクスポートしない
df.to_csv('output_no_header.csv', header=False, index=False)
print("列名をエクスポートしない:")
with open('output_no_header.csv', 'r') as f:
print(f.read())
print()
# 例3c:UTF-8エンコーディングを使用(中国語対応)
df_cn = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [28, 35, 42],
'城市': ['北京', '上海', '广州']
})
df_cn.to_csv('output_utf8.csv', index=False, encoding='utf-8-sig') # utf-8-sig はExcelでのオープンをサポート
print("UTF-8エンコーディング(中国語含む):")
with open('output_utf8.csv', 'r', encoding='utf-8-sig') as f:
print(f.read())
print()
# 例3d:追記モード
# まずファイルを作成し、その後データを追記
df.to_csv('output_append.csv', index=False)
# さらにデータを追記
df_append = pd.DataFrame({
'name': ['John', 'Mary'],
'age': [30, 27],
'city': ['Hangzhou', 'Nanjing']
})
df_append.to_csv('output_append.csv', index=False, mode='a', header=False)
print("追記モード:")
with open('output_append.csv', 'r') as f:
print(f.read())
実行結果の予想:
带索引和索引列名: user_id,name,age,city A001,Tom,28,直接在 A002,Jerry,35,Shanghai A003,Mike,42,Guangzhou A004,Lucy,26,Shenzhen 不导出列名: Tom,28,Beijing Jerry,35,Shanghai Mike,42,Guangzhou Lucy,26,Shenzhen UTF-8 编码(含中文): 姓名,年龄,出现 张三,28,北京 李四,35,上海 王五,42,广州 追加模式: Tom,28,Beijing Jerry,35,CSV Mike,42,Guangzhou Lucy,26,Shenzhen John,30,Hangzhou Mary,27,Nanjing 追加模式 27, 格式
コードの解説:
index_labelパラメータでインデックス列に名前を指定します。header=False列名をエクスポートしないため、複数のファイルを追記・結合する場合に適しています。encoding='utf-8-sig'UTF-8エンコーディングの前にBOMを追加し、Excelで直接開くのに便利です。mode='a'追記モードは、既存ファイルの末尾に新しいデータを追加します。
注意事項
- デフォルトではインデックスをエクスポートします。不要な場合は設定してください
index=False。 - 中国語データを処理する際は、正しいエンコーディングを指定してください(推奨:
utf-8-sig)。 mode='a'追記モードの場合は、同時に設定が必要かどうかに注意してくださいheader=False重複する列名を避けます。- 大規模なDataFrameをエクスポートする場合、使用できます
chunksizeパラメータでチャンク単位で書き込みます。 float_formatPythonのフォーマット構文を使用します。例:'%.2f'小数点以下2桁を保持します。
まとめ
to_csv()DataFrameで最もよく使われるエクスポートメソッドの1つで、機能は非常に充実しています。データをさまざまな形式のCSVファイルにエクスポートでき、区切り文字、エンコーディング、インデックス処理などのカスタマイズをサポートします。
実際の業務では、CSVはデータ交換の一般的な形式であり、to_csv()の使用頻度は非常に高いです。読者はさまざまなパラメータの使い方、特にエンコーディング処理とインデックス制御をしっかり習得することをお勧めします。
その他の拡張