2017-01-22 10 views
1

pandasデータフレームに大容量(53MB)のXMLファイルをロードしようとしています。ここで(NTSBの航空事故報告書の公開データベースからの)実際のデータの3行がありますが、実際のファイルが77257行あります、xmlファイルのデータフレームへの効率的な変換

<?xml version="1.0"?> 
<DATA xmlns="http://www.ntsb.gov"> 
<ROWS> 
    <ROW EventId="20150901X74304" InvestigationType="Accident" AccidentNumber="GAA15CA244" EventDate="09/01/2015" Location="Truckee, CA" Country="United States" Latitude="" Longitude="" AirportCode="" AirportName="" InjurySeverity="" AircraftDamage="" AircraftCategory="" RegistrationNumber="N786AB" Make="JOE SALOMONE" Model="SUPER CUB SQ2" AmateurBuilt="" NumberOfEngines="" EngineType="" FARDescription="" Schedule="" PurposeOfFlight="" AirCarrier="" TotalFatalInjuries="" TotalSeriousInjuries="" TotalMinorInjuries="" TotalUninjured="" WeatherCondition="" BroadPhaseOfFlight="" ReportStatus="Preliminary" PublicationDate=""/> 
    <ROW EventId="20150901X92332" InvestigationType="Accident" AccidentNumber="CEN15LA392" EventDate="08/31/2015" Location="Houston, TX" Country="United States" Latitude="29.809444" Longitude="-95.668889" AirportCode="IWS" AirportName="WEST HOUSTON" InjurySeverity="Non-Fatal" AircraftDamage="Substantial" AircraftCategory="Airplane" RegistrationNumber="N452CS" Make="CESSNA" Model="T240" AmateurBuilt="No" NumberOfEngines="" EngineType="" FARDescription="Part 91: General Aviation" Schedule="" PurposeOfFlight="Instructional" AirCarrier="" TotalFatalInjuries="" TotalSeriousInjuries="" TotalMinorInjuries="" TotalUninjured="2" WeatherCondition="VMC" BroadPhaseOfFlight="LANDING" ReportStatus="Preliminary" PublicationDate="09/04/2015"/> 
    <ROW EventId="20150729X33718" InvestigationType="Accident" AccidentNumber="CEN15FA325" EventDate="" Location="Truth or Consequences, NM" Country="United States" Latitude="33.250556" Longitude="-107.293611" AirportCode="TCS" AirportName="TRUTH OR CONSEQUENCES MUNI" InjurySeverity="Fatal(2)" AircraftDamage="Substantial" AircraftCategory="Airplane" RegistrationNumber="N32401" Make="PIPER" Model="PA-28-151" AmateurBuilt="No" NumberOfEngines="1" EngineType="Reciprocating" FARDescription="Part 91: General Aviation" Schedule="" PurposeOfFlight="Personal" AirCarrier="" TotalFatalInjuries="2" TotalSeriousInjuries="" TotalMinorInjuries="" TotalUninjured="" WeatherCondition="" BroadPhaseOfFlight="UNKNOWN" ReportStatus="Preliminary" PublicationDate="08/10/2015"/> 
</ROWS> 
</DATA> 

私はhereから適応次のコードを、動作しますが、それは非常に遅いですこのデータのために(私のシステムで30分以上)。自分のXMLの構造が異なるため、元のサンプルが動作するようにソリューションを投稿することはできません。このデータを読み込むための効率的な方法はありますか?

path_to_xml_file = mypath 

import pandas as pd 
import xml.etree.ElementTree as ET 

#Load xml file data 
tree = ET.parse(path_to_xml_file) 
root = tree.getroot() 

#Grab list of column names 
aviationdata_column_names = root[0][0].attrib.keys()    
#Create empty dataframe 
aviationdata_df = pd.DataFrame(columns=aviationdata_column_names) 

#Loop through tree and append to dataframe 
for i in range(0,len(root[0])-1): 
    new_row = pd.Series(root[0][i].attrib) 
    new_row.name = i 
    aviationdata_df = aviationdata_df.append(new_row) 

は、インターネット(herehere、およびhere)を中心に掲載同様の質問に対する様々な解決策がありますが、私はそれらを実装運を持っていませんでした。バージョンの問題がその一部を担当している可能性があります(Python 2.7を使用しています)。

+0

@jezrael 0または1のいずれかの要素。これらのメソッドをxmlファイルにループさせ、構造体全体をどのようにプルするのですか? – Edward

+0

@jezrael悲しいことですが、これはさまざまなファイル形式で作業することを学ぶ練習です。この特定のデータセットにxmlを使用するように求められます。 – Edward

+0

@jezrael - 私は以前の質問へのリンク参照を感謝します。そして、私はxmlがあなたにとっては複雑すぎるとは思わない! – Parfait

答えて

3

XMLは属性中心であり(要素値なし)、ディクショナリのキーと値のペアを格納するすべての属性を反復することを検討してください(xml.etree.ElementTree)。

以下

属性のリストがDataFrame()コールに辞書を設定するバインド:私は、これらの4つの方法の最初の3をしようとすると、彼らはデータフレームを返す

import pandas as pd 
import xml.etree.ElementTree as ET 

path_to_xml_file = mypath 

# Load xml file data 
tree = ET.parse(path_to_xml_file) 

data = [] 
for el in tree.iterfind('./*'): 
    for i in el.iterfind('*'): 
     data.append(dict(i.items())) 

df = pd.DataFrame(data) 

出力

# FIRST FEW COLUMNS 
print(df[list(range(12))]) 

# AccidentNumber AirCarrier AircraftCategory AircraftDamage AirportCode     AirportName AmateurBuilt BroadPhaseOfFlight  Country  EngineType EventDate   EventId 
# 0  GAA15CA244                              United States     09/01/2015 20150901X74304 
# 1  CEN15LA392     Airplane Substantial   IWS    WEST HOUSTON   No   LANDING United States     08/31/2015 20150901X92332 
# 2  CEN15FA325     Airplane Substantial   TCS TRUTH OR CONSEQUENCES MUNI   No   UNKNOWN United States Reciprocating    20150729X33718 
+1

ありがとう@パフェ。 30分以上1秒未満。まさに私がpythonができると思ったもの。 – Edward

+1

素晴らしい!属性セットは辞書であるため、最後の 'for'ループは必要ありませんでした。短いコードを参照してください。 – Parfait

関連する問題