医療関連の企業に勤める友人から、大量のロング型データをワイド型データに変換したいって相談されました。
そちらの業界では、患者などのデータをワイド型で表すことが多いという。
そこで、変換ツールをpython作ったので記事にしました。
以下、変換イメージ
変換前
ID,data,item,
0,100,BPS,
0,200,LDL,
1,20,YBY,
2,XXX,YYY,
2,AAA,BBB,
変換後
ID YBY BBB BPS LDL YYY
0 N/A N/A 100 200 N/A
1 20 N/A N/A N/A N/A
2 N/A AAA N/A N/A XXX
そこで、pandasを利用してツールを作成しました。
作成したツールは以下になります。
import pandas as pd
import csv
csv_file = open("sample.csv", "r",
encoding="ms932", errors="", newline="")
f = csv.reader(csv_file, delimiter=",", doublequote=True,
lineterminator="\r\n", quotechar='"', skipinitialspace=True)
columns = next(f)
data = []
for row in f:
data.append(row)
df = pd.DataFrame(data, columns=columns)
df_t = df.pivot_table(values=[columns[1]], index=[columns[0]], columns=[
columns[2]], aggfunc='sum', fill_value='N/A')
df_t.to_excel('out.xlsx', index=True)
sample.csvを読み取って、ワイド型データに変換し、Excelに出力します。
前提として、csvの列は3つになっています。
IDごとに行を作成し、itemの項目が多いほど列が追加されます。そして、各値にdataが設定されます。もし、dataがなければN/Aが設定されます。
CSVをロング型からワイド型に変換するしたい方がいましたら、こちらの実装を参考にしてください。
以下のGithubにもソースは載せています。
https://github.com/kurihiro0119/transform_wide_long