【Python】2つ以上のcsvを結合して1つのcsvにする方法を解説

この記事では、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ファイルに同じ列名があっても、データ型が異なる場合があります。

例えば、片方のファイルでは数値が文字列として保存されていることがあります。

この場合、データ型を統一する必要があります。

ファイルが見つからないエラー

ファイルが見つからないエラーは、プログラムが指定したパスにファイルを見つけられないときに発生します。

以下の対処法を試してみてください。

  1. ファイルパスの確認: ファイルのパスが正しいか確認します。

相対パスと絶対パスの違いにも注意が必要です。

  1. ファイル名の確認: 大文字小文字の違いや拡張子(.csvなど)を確認します。
  2. ファイルの存在確認: 実際にそのパスにファイルが存在するか、エクスプローラーやターミナルで確認します。

データ型の不一致

異なるCSVファイルを結合する際、同じ列名でもデータ型が異なることがあります。

これにより、結合後のデータフレームにエラーが発生することがあります。

以下の対処法を考慮してください。

  1. データ型の確認: pandasを使用している場合、df.dtypesを使って各列のデータ型を確認します。
  2. データ型の変換: 必要に応じて、astype()メソッドを使ってデータ型を変換します。

例えば、数値を文字列に変換する場合は、df['column_name'] = df['column_name'].astype(str)とします。

パフォーマンスの最適化

大きなCSVファイルを結合する際、パフォーマンスが低下することがあります。

以下の方法で最適化を図ることができます。

  1. 必要な列だけを読み込む: pd.read_csv()usecols引数を使って、必要な列だけを読み込むことでメモリ使用量を削減します。
  2. データ型の指定: dtype引数を使って、各列のデータ型を指定することで、読み込み速度を向上させることができます。

大規模データの処理方法

大規模なCSVファイルを扱う場合、メモリに収まりきらないことがあります。

以下の方法で対処できます。

  1. チャンク処理: pd.read_csv()chunksize引数を使って、データをチャンク(小分け)で読み込みます。

これにより、メモリの使用量を抑えることができます。

  1. データベースの利用: 大規模データを扱う場合、CSVファイルではなくデータベースを使用することを検討してください。

SQLiteやPostgreSQLなどのデータベースを利用することで、効率的にデータを管理できます。

メモリ使用量の管理

メモリ使用量を管理することは、特に大規模データを扱う際に重要です。

以下の方法でメモリ使用量を最適化できます。

  1. データ型の最適化: 不要に大きなデータ型を使用しないようにし、必要なデータ型を選択します。

例えば、整数型の列に対してint32int16を使用することでメモリを節約できます。

  1. 不要なデータの削除: 結合後に不要な列や行を削除することで、メモリの使用量を減らすことができます。

drop()メソッドを使用して、不要なデータを削除しましょう。

これらの注意点や対処法を理解し、適切に対処することで、CSVファイルの結合作業をスムーズに進めることができます。

目次から探す