背景
他チームからデータファイルを連携されて集計や分析を依頼されることがある。
その際にファイルが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 |