この記事では、Pythonを使って複数のCSVファイルを簡単に結合する方法を紹介します。
CSVファイルはデータを表形式で保存するための一般的な形式ですが、複数のファイルを一つにまとめることがよくあります。
この記事を読むことで、Pythonの標準ライブラリであるcsv
モジュールや、データ分析に便利なpandas
ライブラリを使って、CSVファイルを結合する手順を理解できるようになります。
2つ以上のCSVファイルを結合する方法
CSV(Comma-Separated Values)ファイルは、データを表形式で保存するための一般的なフォーマットです。
Pythonを使って複数のCSVファイルを結合する方法を、csv
モジュールとpandas
ライブラリの2つの方法で解説します。
方法1: csvモジュールを使用する
Pythonの標準ライブラリであるcsv
モジュールを使って、CSVファイルを結合する方法を見ていきましょう。
CSVファイルの読み込み
まず、結合したいCSVファイルを読み込みます。
以下のコードでは、2つのCSVファイルを読み込む例を示します。
import csv
# 読み込むCSVファイルのパス
file1 = 'data1.csv'
file2 = 'data2.csv'
# データを格納するリスト
data = []
# CSVファイル1の読み込み
with open(file1, mode='r', encoding='utf-8') as f1:
reader = csv.reader(f1)
for row in reader:
data.append(row) # 行をリストに追加
# CSVファイル2の読み込み
with open(file2, mode='r', encoding='utf-8') as f2:
reader = csv.reader(f2)
for row in reader:
data.append(row) # 行をリストに追加
csv.readerの使い方
csv.reader
は、CSVファイルを行ごとに読み込むための関数です。
上記のコードでは、各ファイルの行をリストに追加しています。
ヘッダーの処理
CSVファイルには通常、最初の行にヘッダー(列名)が含まれています。
ヘッダーを一度だけ追加するためには、以下のように条件を追加します。
# ヘッダーを追加するフラグ
header_added = False
# CSVファイル1の読み込み
with open(file1, mode='r', encoding='utf-8') as f1:
reader = csv.reader(f1)
for row in reader:
if not header_added:
data.append(row) # ヘッダーを追加
header_added = True
else:
data.append(row) # データ行を追加
データの結合
上記の方法で、複数のCSVファイルからデータをリストに追加することができます。
リストへのデータ追加
リストに追加したデータは、後で新しいCSVファイルに書き込むことができます。
重複行の処理
重複行を削除するためには、セットを使ってユニークな行だけを保持することができます。
unique_data = list(set(tuple(row) for row in data)) # 重複行を削除
結合したデータの書き込み
結合したデータを新しいCSVファイルに書き込むためには、csv.writer
を使用します。
csv.writerの使い方
以下のコードで、結合したデータを新しいCSVファイルに書き込むことができます。
with open('combined_data.csv', mode='w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(unique_data) # ユニークなデータを全て書き込む
新しいCSVファイルの作成
これで、combined_data.csv
という新しいCSVファイルが作成され、結合されたデータが保存されます。
方法2: pandasライブラリを使用する
次に、pandas
ライブラリを使用してCSVファイルを結合する方法を見ていきましょう。
pandas
はデータ分析に特化したライブラリで、CSVファイルの操作が非常に簡単です。
pandasのインストール
まず、pandas
をインストールする必要があります。
以下のコマンドを実行してください。
pip install pandas
インストール方法
上記のコマンドを実行することで、pandas
がインストールされます。
環境設定
インストールが完了したら、次にpandas
をインポートします。
import pandas as pd
CSVファイルの読み込み
pandas
を使ってCSVファイルを読み込むには、pd.read_csv()
を使用します。
pd.read_csv()の使い方
以下のコードで、CSVファイルをデータフレームとして読み込むことができます。
df1 = pd.read_csv('data1.csv')
df2 = pd.read_csv('data2.csv')
データフレームの確認
データフレームの内容を確認するには、head()メソッド
を使います。
print(df1.head()) # data1.csvの最初の5行を表示
print(df2.head()) # data2.csvの最初の5行を表示
データの結合
pandas
では、concat()メソッド
を使ってデータフレームを結合することができます。
pd.concat()の使い方
以下のコードで、2つのデータフレームを縦に結合することができます。
combined_df = pd.concat([df1, df2], ignore_index=True) # 縦に結合
結合方法の選択(縦結合・横結合)
concat()メソッド
のaxis
引数を使うことで、横結合も可能です。
combined_df = pd.concat([df1, df2], axis=1) # 横に結合
結合したデータの書き込み
結合したデータを新しいCSVファイルに書き込むには、to_csv()メソッド
を使用します。
to_csv()メソッドの使い方
以下のコードで、結合したデータをCSVファイルに保存できます。
combined_df.to_csv('combined_data_pandas.csv', index=False) # インデックスを含めずに保存
オプション設定(インデックスの有無など)
to_csv()メソッド
には、さまざまなオプションがあります。
例えば、index=False
を指定することで、インデックスをCSVファイルに含めないようにできます。
これで、pandas
を使ったCSVファイルの結合方法も完了です。
csv
モジュールとpandas
のどちらを使うかは、データの規模や処理内容に応じて選択してください。
実践例
例1: 簡単なCSVファイルの結合
ここでは、2つの簡単なCSVファイルを結合する方法を紹介します。
まず、サンプルCSVファイルを準備します。
サンプルCSVファイルの準備
以下の2つのCSVファイルを用意します。
id,name,age
1,田中,25
2,鈴木,30
id,name,age
3,佐藤,22
4,高橋,28
これらのファイルは、同じ列構成を持っているため、簡単に結合できます。
コード例とその解説
次に、csv
モジュールを使用してこれらのCSVファイルを結合するコードを示します。
import csv
# 結合するCSVファイルのリスト
files = ['file1.csv', 'file2.csv']
# 結合後のデータを格納するリスト
combined_data = []
# 各CSVファイルを読み込む
for file in files:
with open(file, mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
# ヘッダーをスキップするために次の行を読み込む
if combined_data == []: # 最初のファイルのヘッダーを追加
combined_data.append(next(reader))
# データを追加
for row in reader:
combined_data.append(row)
# 結合したデータを新しいCSVファイルに書き込む
with open('combined.csv', mode='w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(combined_data)
print("CSVファイルの結合が完了しました。")
このコードでは、まず結合するCSVファイルのリストを作成し、各ファイルを読み込んでデータをcombined_data
リストに追加しています。
最初のファイルのヘッダーを追加した後、各ファイルのデータを順次追加します。
最後に、結合したデータを新しいCSVファイルcombined.csv
に書き込んでいます。
例2: 複雑なCSVファイルの結合
次に、異なる列を持つCSVファイルを結合する方法を見ていきます。
異なる列を持つCSVファイルの結合
以下の2つのCSVファイルを用意します。
id,name,age
1,田中,25
2,鈴木,30
id,city
3,東京
4,大阪
この場合、file3.csv
にはage
列があり、file4.csv
にはcity
列があります。
これらを結合するには、共通の列(この場合はid
)を基に結合します。
コード例とその解説
pandas
ライブラリを使用して、異なる列を持つCSVファイルを結合するコードを示します。
import pandas as pd
# CSVファイルの読み込み
df1 = pd.read_csv('file3.csv')
df2 = pd.read_csv('file4.csv')
# id列を基に結合
combined_df = pd.merge(df1, df2, on='id', how='outer')
# 結合したデータを新しいCSVファイルに書き込む
combined_df.to_csv('combined_complex.csv', index=False)
print("複雑なCSVファイルの結合が完了しました。")
このコードでは、まずpandas
を使って2つのCSVファイルをデータフレームとして読み込みます。
次に、pd.merge()関数
を使用して、id
列を基に外部結合(how='outer'
)を行います。
これにより、両方のデータフレームのすべての行が結合され、欠損値はNaNとして表示されます。
最後に、結合したデータを新しいCSVファイルcombined_complex.csv
に書き込んでいます。
これで、異なる列を持つCSVファイルの結合方法も理解できたと思います。
これらの手法を使って、さまざまなCSVファイルを効率的に結合してみてください。
注意点とトラブルシューティング
CSVファイルを結合する際には、いくつかの注意点やトラブルが発生することがあります。
ここでは、よくあるエラーとその対処法、パフォーマンスの最適化、大規模データの処理方法、メモリ使用量の管理について解説します。
よくあるエラーとその対処法
CSVファイルを結合する際に遭遇するエラーには、以下のようなものがあります。
- ファイルが見つからないエラー: 指定したファイルパスが間違っている場合に発生します。
ファイル名やパスを再確認し、正しいパスを指定してください。
- データ型の不一致: 異なるCSVファイルに同じ列名があっても、データ型が異なる場合があります。
例えば、片方のファイルでは数値が文字列として保存されていることがあります。
この場合、データ型を統一する必要があります。
ファイルが見つからないエラー
ファイルが見つからないエラーは、プログラムが指定したパスにファイルを見つけられないときに発生します。
以下の対処法を試してみてください。
- ファイルパスの確認: ファイルのパスが正しいか確認します。
相対パスと絶対パスの違いにも注意が必要です。
- ファイル名の確認: 大文字小文字の違いや拡張子(.csvなど)を確認します。
- ファイルの存在確認: 実際にそのパスにファイルが存在するか、エクスプローラーやターミナルで確認します。
データ型の不一致
異なるCSVファイルを結合する際、同じ列名でもデータ型が異なることがあります。
これにより、結合後のデータフレームにエラーが発生することがあります。
以下の対処法を考慮してください。
- データ型の確認:
pandas
を使用している場合、df.dtypes
を使って各列のデータ型を確認します。 - データ型の変換: 必要に応じて、
astype()メソッド
を使ってデータ型を変換します。
例えば、数値を文字列に変換する場合は、df['column_name'] = df['column_name'].astype(str)
とします。
パフォーマンスの最適化
大きなCSVファイルを結合する際、パフォーマンスが低下することがあります。
以下の方法で最適化を図ることができます。
- 必要な列だけを読み込む:
pd.read_csv()
のusecols
引数を使って、必要な列だけを読み込むことでメモリ使用量を削減します。 - データ型の指定:
dtype
引数を使って、各列のデータ型を指定することで、読み込み速度を向上させることができます。
大規模データの処理方法
大規模なCSVファイルを扱う場合、メモリに収まりきらないことがあります。
以下の方法で対処できます。
- チャンク処理:
pd.read_csv()
のchunksize
引数を使って、データをチャンク(小分け)で読み込みます。
これにより、メモリの使用量を抑えることができます。
- データベースの利用: 大規模データを扱う場合、CSVファイルではなくデータベースを使用することを検討してください。
SQLiteやPostgreSQLなどのデータベースを利用することで、効率的にデータを管理できます。
メモリ使用量の管理
メモリ使用量を管理することは、特に大規模データを扱う際に重要です。
以下の方法でメモリ使用量を最適化できます。
- データ型の最適化: 不要に大きなデータ型を使用しないようにし、必要なデータ型を選択します。
例えば、整数型の列に対してint32
やint16
を使用することでメモリを節約できます。
- 不要なデータの削除: 結合後に不要な列や行を削除することで、メモリの使用量を減らすことができます。
drop()メソッド
を使用して、不要なデータを削除しましょう。
これらの注意点や対処法を理解し、適切に対処することで、CSVファイルの結合作業をスムーズに進めることができます。