読者です 読者をやめる 読者になる 読者になる

DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

様式1のペイロード項目詳細を扱いやすい形に変換する

前回に引き続き、様式1データを扱います。 まず、前回紹介したペイロードマスタを読み込みましょう。

payload = pd.read_csv('ペイロードマスタ.csv')

payload.head()

コード ペイロー ド種別 レコード必須 条件等 有 連番 ペイ ロード番号 項目 必須 条件 有 項目名
A000010 患者属性 - 1 生年月日
A000010 患者属性 - 2 性別
A000010 患者属性 - 3 患者住所地域の郵便番号
A000020 入院情報 - 1 入院年月日
A000020 入院情報 - 2 入院経路
A000020 入院情報 - 3 ※A 他院よりの紹介の有無
A000020 入院情報 - 4 ※A 自院の外来からの入院
A000020 入院情報 - 5 ※A 予定・救急医療入院
A000020 入院情報 - 6 ※A 救急車による搬送の有無
A000020 入院情報 - 7 ※A 入院前の在宅医療の有無
A000020 入院情報 - 8 ※A 自傷行為・自殺企図の有無

こんな感じのデータが出てくるはずです。 さて、このまんまでは煮ても焼いても食えません。
まずやるべきことは、コードペイロード番号のセットを作り、項目名と紐付けることです。 いかにも辞書型を使うケースですよね。
さて、Pythonの辞書型は{key : value}のようにキーと値を紐付けるものです。
keyの部分は変更不可能なものなら何でも使うことが出来ます。例えば、リストは変更可能なのでキーに使えませんが、タプルは使えます。
(どんな用途があるか思いつきませんが、関数も変更不可能なのでキーに使えます)
なので、今回はコードペイロード番号のタプルをキーにした辞書を作ってみましょう。
辞書内包表記を使うのが簡単です。

paydict = {(k1,k2):v for k1,k2,v in zip(payload['コード'],payload['ペイロード番号'],payload['項目名'])}

とすれば、

{('A000010', 1): '生年月日',
 ('A000010', 2): '性別',
 ('A000010', 3): '患者住所地域の郵便番号',
 ('A000020', 1): '入院年月日',
 ('A000020', 2): '入院経路',
 ('A000020', 3): '他院よりの紹介の有無',
 ('A000020', 4): '自院の外来からの入院',
 ('A000020', 5): '予定・救急医療入院',

このようにコードペイロードのタプルをキーにした、項目リストが作れます。 逆転したものが欲しければ、

reverse = {v:k for k,v in paydict2.items()}

としてやるだけで、

{'24 時間以内の死亡の有無': ('A000030', 4),
 'BurnIndex': ('M160010', 2),
 'Hugh-Jones 分類': ('M040010', 2),
 'ICD10 コード': ('A006040', 2),
 'NYHA 心機能分類': ('M050010', 2),
 'UICC 病期分類(M)': ('CAN0020', 5),
 'UICC 病期分類(N)': ('CAN0020', 4),
 'UICC 病期分類(T)': ('CAN0020', 3),
 'UICC 病期分類(版)': ('CAN0020', 6),
 'がんの初発、再発': ('CAN0010', 3),

このように、キーと値を逆転させた辞書が手に入ります。

「うーん、タプルの順番だけでコードとペイロード番号を管理するのは引っかかるぞ…」という向きには、名前付きタプルが使えます。

from collections import namedtuple
Paykey = namedtuple('payload_key',['code','number'])

名前付きタプルは、その名の通り、タプルの要素に名前を付けて管理できます。ちょっと使い捨てクラスっぽいですね。

paydict = {Paykey(k1,k2):v for k1,k2,v in zip(payload['コード'],payload['ペイロード番号'],payload['項目名'])}

としてやれば、

{payload_key(code='A000010', number=1): '生年月日',
 payload_key(code='A000010', number=2): '性別',
 payload_key(code='A000010', number=3): '患者住所地域の郵便番号',
 payload_key(code='A000020', number=1): '入院年月日',
 payload_key(code='A000020', number=2): '入院経路',
 payload_key(code='A000020', number=3): '他院よりの紹介の有無',
 payload_key(code='A000020', number=4): '自院の外来からの入院',
 payload_key(code='A000020', number=5): '予定・救急医療入院',
 payload_key(code='A000020', number=6): '救急車による搬送の有無',
 payload_key(code='A000020', number=7): '入院前の在宅医療の有無',

このように要素に名前をつけて管理できます。
さて次回は、様式1データそのものの加工を行ってみましょう。