複数CSVを一致する列で統合
先日、サービスのリプレイスに伴いデータ移行を担当しました。
その際に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_id
とarchive_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の整形をする上で、便利だった関数があったのでご紹介していこうと思います。