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

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

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

EFファイル統合スクリプト(平成28年度版)

EFファイル統合をPython+Pandasで行う

さて6月になりましたが、未だにEF統合ツールが公開されません。 いい加減待つのも飽きましたので、平成28年度様式に対応したEF統合スクリプトを書きました。

使い方は単純です。

  1. 下記のコードをコピペし、テキストエディタ(メモ帳でもOK)に貼り付ける。ファイル名は何でもいいが、拡張子は.pyにして保存する。

  2. 適当なフォルダを用意し、EファイルとFファイルを置いて'DRGE.txt'、'DRGF.txt'とリネーム。

  3. 1番で用意した.pyファイルを同じフォルダに置いて、実行する。outputEF.txtという名前でEFファイルが出力される。

ただし、事前にPythonとPandasの環境を用意する必要があります。 初めてPythonを使う方はAnacondaをインストールすれば全部入ってきます。

(Python2.7とPython3.5がありますが、3.5を選んでください)

コマンドプロンプトを開き、cd c:\Users\Username\Foldernameという感じで該当フォルダに移動し、python foo.pyという風にpythonコマンドでpythonファイルを実行します。
面倒であれば、AnacondaについてくるSpyderというアプリケーションで.pyファイルを開けば、そのまま実行できます。

# -*- coding: utf-8 -*-

import pandas as pd

#Eファイルを読み込み。
edata = pd.read_csv('DRGE.TXT',delimiter='\t',names = (
'施設コード'
,'データ識別番号'    
,'退院年月日'  
,'入院年月日'  
,'データ区分'  
,'順序番号'
,'病院点数マスタコード'   
,'レセプト電算コード'  
,'解釈番号  '
,'診療明細名称'   
,'行為点数'
,'行為薬剤料'  
,'行為材料料'  
,'円・点区分'  
,'行為回数'
,'保険者番号'  
,'レセプト種別コード'  
,'実施年月日'
,'レセプト科区分'
,'診療科区分'
,'医師コード'
,'病棟コード'  
,'病棟区分'
,'入外区分'
,'施設タイプ'
),parse_dates=['入院年月日','実施年月日'],header = None,dtype={'医師コード':str},encoding = 'shift_jisx0213')

#Fファイルを読み込み
fdata = pd.read_csv('DRGF.TXT',delimiter='\t',names = ('施設コード'    
,'データ識別番号'    
,'退院年月日'  
,'入院年月日'  
,'データ区分'  
,'順序番号' 
,'行為明細番号'
,'病院点数マスタコード'   
,'レセプト電算コード'  
,'解釈番号' 
,'診療明細名称'   
,'使用量'
,'基準単位' 
,'行為明細点数'
,'行為明細薬剤料'    
,'行為明細材料料'    
,'円点区分' 
,'出来高実績点数'
,'行為明細区分情報'),parse_dates=['入院年月日'],header = None,dtype={'行為明細区分情報':str},encoding = 'shift_jisx0213')


fdata['明細点数・金額'] = fdata['行為明細点数'] + fdata['行為明細薬剤料'] + fdata['行為明細材料料']
fdata.drop(['行為明細点数','行為明細薬剤料','行為明細材料料'],axis=1,inplace = True)

efdata = pd.concat([edata,fdata])


#行為明細番号を使って並べ替えをするが、その前にfillnaメソッドでEファイル由来のレコードに0番を付番する

efdata['行為明細番号'].fillna(0,inplace=True)

#順序番号、行為明細番号を使って並び替え

efdata.sort_values(['データ識別番号','入院年月日','データ区分','順序番号','行為明細番号'],inplace = True)
efdata.reset_index(inplace=True)

#統合の結果空白になってしまうレコードを、fillnaメソッドで穴埋めする

fill_list='行為回数','実施年月日','診療科区分','医師コード','病棟コード','病棟区分'

for val in fill_list:
    efdata[val].fillna(method='pad',inplace=True)

sort_list = '施設コード','データ識別番号','退院年月日','入院年月日','データ区分',\
'順序番号','行為明細番号','病院点数マスタコード','レセプト電算コード','解釈番号','診療明細名称',\
'使用量','基準単位','明細点数・金額','円点区分','出来高実績点数','行為明細区分情報','行為点数','行為薬剤料',\
'行為材料料','行為回数','保険者番号','レセプト種別コード','実施年月日','レセプト科区分',\
'診療科区分','医師コード','病棟コード','病棟区分','入外区分','施設タイプ'


efdata_sorted = efdata.reindex(columns=sort_list)

efdata_sorted['退院年月日'] = efdata_sorted['退院年月日'].replace(0,'infinity')

K = efdata_sorted['医師コード']
efdata_sorted['医師コード'] = [i.strip() for i in K]

efdata_sorted.to_csv('outputEF.txt',index=False,sep='\t',encoding='utf-8')