背景
他チームからデータファイルを連携されて集計や分析を依頼されることがある。
その際にファイルが1つにまとまっていると扱いやすいが、データの種類でファイルが分かれていたり、データ件数が多いために分割されて連携されることがあるので、それらをひとまとめにする作業の備忘録。
ファイル名を直接打ち込むことなく、条件に合ったファイルのみ取得しまとめることで、入力ミスや読み込みの漏れを解消することが目的。
ここでは簡易的に、Google Driveに格納されたIDごとのスコアのデータファイル複数とセグメントのデータファイル複数をひとまとめにすることを考える。

コード
import pandas as pd
import os
# データの格納場所を設定
PATH = '/content/drive/MyDrive/data'
# データの格納場所からファイル名の一覧を取得
files = os.listdir(PATH)
files
['data_score_1_20.csv',
'data_score_21_40.csv',
'data_score_41_80.csv',
'data_segment_41_80.csv',
'data_segment_1_20.csv',
'data_segment_21_40.csv']
# scoreのデータファイルのみファイル名を取得
target = 'score'
file_name_list = [file for file in files if target in file]
file_name_list.sort()
file_name_list
['data_score_1_20.csv', 'data_score_21_40.csv', 'data_score_41_80.csv']
# scoreのデータのみ読み込み、縦結合、id列をインデックスに設定
score_data = pd.DataFrame()
for read_file in file_name_list:
tmp = pd.read_csv(os.path.join(PATH, read_file))
score_data = pd.concat([score_data, tmp])
score_data.set_index('id', inplace=True)
score_data
| id | score |
|---|---|
| 1 | 14 |
| 2 | 32 |
| 3 | 24 |
| 4 | 10 |
| 5 | 60 |
| ... | ... |
| 76 | 51 |
| 77 | 32 |
| 78 | 80 |
| 79 | 26 |
| 80 | 49 |
# segmentのデータファイルのみファイル名を取得
target = 'segment'
file_name_list = [file for file in files if target in file]
file_name_list.sort()
file_name_list
['data_segment_1_20.csv', 'data_segment_21_40.csv', 'data_segment_41_80.csv']
# segmentのデータのみ読み込み、縦結合、id列をインデックスに設定
segment_data = pd.DataFrame()
for read_file in file_name_list:
tmp = pd.read_csv(os.path.join(PATH, read_file))
segment_data = pd.concat([segment_data, tmp])
segment_data.set_index('id', inplace=True)
segment_data
| id | segment |
|---|---|
| 1 | 5 |
| 2 | 1 |
| 3 | 2 |
| 4 | 4 |
| 5 | 5 |
| ... | ... |
| 76 | 2 |
| 77 | 3 |
| 78 | 5 |
| 79 | 5 |
| 80 | 5 |
# scoreのデータとsegmentのデータを横結合
merge_data = pd.concat([score_data, segment_data], axis=1)
merge_data
| id | score | segment |
|---|---|---|
| 1 | 14 | 5 |
| 2 | 32 | 1 |
| 3 | 24 | 2 |
| 4 | 10 | 4 |
| 5 | 60 | 5 |
| ... | ... | ... |
| 76 | 51 | 2 |
| 77 | 32 | 3 |
| 78 | 80 | 5 |
| 79 | 26 | 5 |
| 80 | 49 | 5 |