Как извлечь значение, если атрибут существует, и сохранить его во фрейме данных? - PullRequest
0 голосов
/ 11 января 2020

Python новичок здесь. У меня есть следующая структура XML (на самом деле это файл 2,5 ГБ):

<events version="1.0">
    <event time="13834.0" type="actend" person="1537047" link="335909" facility="home811408" actType="home"  />
    <event time="13834.0" type="departure" person="1537047" link="335909" legMode="car_passenger"  />
    <event time="14516.0" type="travelled" person="1537047" distance="9749.86232009391"  />
    <event time="14516.0" type="arrival" person="1537047" link="79554" legMode="car_passenger"  />
    <event time="14516.0" type="actstart" person="1537047" link="79554" facility="105155" actType="work"  />
    <event time="15380.0" type="actend" person="3716370" link="280959" facility="outside_484" actType="outside"  />
    <event time="15380.0" type="departure" person="3716370" link="280959" legMode="car"  />
    <event time="15380.0" type="PersonEntersVehicle" person="3716370" vehicle="3716370"  />
    <event time="15380.0" type="vehicle enters traffic" person="3716370" link="280959" vehicle="3716370" networkMode="car" relativePosition="1.0"  />
    <event time="15380.0" type="coldEmissionEvent" linkId="280959" vehicleId="3716370" NO2="0.00273337378166616" NOx="0.33" HC="3.78" CO="19.99" FC="23.79" PM="0.00789998099207878" NMHC="3.57"  />
    <event time="15381.0" type="left link" vehicle="3716370" link="280959"  />
</events>

Я хочу создать фрейм данных, который включает в себя только атрибуты и соответствующие им значения "link" и " NO 2" .

Мой текущий подход не работает из-за ключевой ошибки «NO2». Кроме того, мне приходится работать с iterparse, поскольку моему компьютеру не хватает памяти для работы с файлом 2,5 ГБ.

tree = ET.iterparse(gzip.open('V0_1pm/output_events.xml.gz', 'r'))
emissions = []
for xml_event, elem in tree:
    if elem.tag == 'event':
        atts = elem.attrib
        emissions.append({
            'NO2': atts['NO2'],
            'link': atts['link'],
        })
    elem.clear()

emissions = pd.DataFrame.from_records(emissions)
emissions

Заранее большое спасибо!

...