複数CSVを一致する列で統合

2023. 3. 3

先日、サービスのリプレイスに伴いデータ移行を担当しました。

その際にPythonのデータ解析ライブラリPandas(パンダス)を用いてCSVの整形を行いました。

普段使用しないPythonですが、

使ってみたらCSVのデータ整形にかなり便利でしたのでご紹介させていただきます。


概要


Pandasのmerge関数を使用して、複数CSVを統合します。

merge関数はSQLのjoinのような役割を果たしてくれます。


サンプルコード


import pandas as pd

OLD_ARCHIVE_CSV_PATH = 'old_archive_list.csv'
NEW_ARCHIVE_CSV_PATH = 'new_archive_list.csv'

def main():
    df1 = pd.read_csv(OLD_ARCHIVE_CSV_PATH)
    df2 = pd.read_csv(NEW_ARCHIVE_CSV_PATH)

    result = pd.merge(df1, df2, left_on='post_title', right_on='title', how='left')
    new_result = result.rename(columns={'id': 'new_archive_id'})
    df_out = new_result.loc[:, ['new_archive_id', 'archive_id']]

    df_out.to_csv('~/Desktop/archive_ids.csv', index=False, float_format='%.0f')

if __name__ == '__main__':
    main()


サンプルコードで登場するCSVの内容


old_archive_list.csvのデータ


new_archive_list.csvのデータ


archive_ids.csvのデータ(出力されるCSV)


サンプルコードの各行の詳細


Pandasをimportして別名を付けています。

import pandas as pd


②対象となるCSVを読み込んでいます。

OLD_ARCHIVE_CSV_PATH = 'old_archive_list.csv'
NEW_ARCHIVE_CSV_PATH = 'new_archive_list.csv'


def main():
    df1 = pd.read_csv(OLD_ARCHIVE_CSV_PATH)
    df2 = pd.read_csv(NEW_ARCHIVE_CSV_PATH)


③merge関数を使用して、2つのCSVを統合しています。

result = pd.merge(df1, df2, left_on='post_title', right_on='title', how='left')

↑を言語化すると↓のようになります。

merge(CSV1, CSV2, left_on='CSV1の結合キー', right_on='CSV2の結合キー', how='結合方法')


オプションの詳細

ON

 結合するキーを指定します。

merge(CSV1, CSV2, on='結合キー', how='結合の方法')


how

 inner

  内部結合によって左右でお互い一致するデータを残します。

result = pd.merge(df1, df2, left_on='post_title', right_on='title', how='inner')


結合結果


 left

  左結合によって左に一致するデータを残します。


 right

  右結合によって右に一致するデータを残します。

result = pd.merge(df1, df2, left_on='post_title', right_on='title', how='right')


結合結果


 outer

  外部結合によって左右両方のデータを残します。

result = pd.merge(df1, df2, left_on='post_title', right_on='title', how='outer')


結合結果


④カラム名をidからnew_archive_idに変更しています。

new_result = result.rename(columns={'id': 'new_archive_id'})


⑤出力する項目をnew_archive_idarchive_idのみにし、順番を指定しています。

df_out = new_result.loc[:, ['new_archive_id', 'archive_id']]


⑥CSVを出力しています。

df_out.to_csv('~/Desktop/archive_ids.csv', index=False, float_format='%.0f')


オプションの詳細

index=False

 indexの有無です。

 デフォルトはTrueになっています。

float_format='%.0f'

 小数点以下をなくしています。

 浮動小数点数floatの書式を指定できます。

 結合時にレコードにnanが入る場合は数字の末尾に.0がついてしまうので追加しています。

  例)1 → 1.0


以上、複数CSVを一致する列で統合する方法でした。

この他にもCSVの整形をする上で、便利だった関数があったのでご紹介していこうと思います。