Парсинг XML файла таблицы с передачей в DataFrame
Пытался получить адекватную таблицу из XML файла и передать ее в фрейм данных.
Как это сделать?
Пробовал парсить в Excel, но в Power Query криво кодировка считывается.
Сам файл по ссылке, там архив. Дайте совет, как лучше получить из него данные корректно.
Ответы (2 шт):
Скорее всего вам поможет библиотека pandas-read-xml, но с ней придётся ещё поразбираться. Там есть примеры, в том числе есть готовый Google Colab.
Ну и нужно прочитать xml файл в кодировке cp1251, конечно.
Я набросал небольшой код, но дальше вам нужно будет самому углубляться в структуру XML, дальше у меня не получилось, нужно время и думать, пробовать:
#!pip install pandas_read_xml
import pandas_read_xml as pdx
filename = "/content/20200914_ED807_full.xml"
root_key_list = ['ED807', 'BICDirectoryEntry']
with open(filename, encoding='cp1251') as fd:
df = pdx.read_xml(fd.read(), root_key_list)
#key_columns = ['BICDirectoryEntry|@BIC']
#data = df.pipe(pdx.auto_separate_tables, key_columns)
Содержимое df:
@BIC ParticipantInfo Accounts SWBICS
0 041280103 {'@NameP': 'УФК по Астраханской области', '@Cn... [{'@Account': '40116810100000010010', '@Regula... NaN
1 044525597 {'@NameP': 'КУ "МИЛЛЕНИУМ БАНК" (ЗАО) - ГК "АС... {'@Account': '30101810645250000597', '@Regulat... NaN
Воспользуйтесь данным решением (с) Austin Taylor:
import xml.etree.ElementTree as ET
import pandas as pd
class XML2DataFrame:
def __init__(self, xml_data):
self.root = ET.XML(xml_data)
def parse_root(self, root):
return [self.parse_element(child) for child in iter(root)]
def parse_element(self, element, parsed=None):
if parsed is None:
parsed = dict()
for key in element.keys():
parsed[key] = element.attrib.get(key)
if element.text:
parsed[element.tag] = element.text
for child in list(element):
self.parse_element(child, parsed)
return parsed
def process_data(self):
structure_data = self.parse_root(self.root)
return pd.DataFrame(structure_data)
xml2df = XML2DataFrame(xml_data)
df = xml2df.process_data()
Пример:
with open(r"D:\download\20200915_ED807_full.xml") as f:
xml_data = f.read()
xml2df = XML2DataFrame(xml_data)
df = xml2df.process_data()
результат:
In [32]: df
Out[32]:
BIC NameP CntrCd Rgn Ind ... SWBIC DefaultSWBIC \
0 041280103 УФК по Астраханской области RU 12 414056 ... NaN NaN
1 044525597 КУ "МИЛЛЕНИУМ БАНК" (ЗАО) - ГК "АСВ" RU 45 109240 ... NaN NaN
2 044525603 КУ ЗАО "ИПОТЕК БАНК" - ГК "АСВ" RU 45 109240 ... NaN NaN
3 044525608 КУ ООО КБ "ДОРИС БАНК" - ГК "АСВ" RU 45 109240 ... NaN NaN
4 044525652 КУ КБ "ПРИСКО КАПИТАЛ БАНК", АО - ГК... RU 45 109240 ... NaN NaN
... ... ... ... .. ... ... ... ...
2368 298003187 Департамент финансов г. Якутска RU 98 677000 ... NaN NaN
2369 015354008 УФК по Оренбургской области RU 53 460014 ... NaN NaN
2370 200000099 Территориальная избирательная комисс... RU 36 443110 ... NaN NaN
2371 200001413 Территориальная избирательная комисс... RU 36 445011 ... NaN NaN
2372 047516949 БАНК "КУБ" (АО) RU 75 455044 ... CRDURU4CXXX 1
EnglName AccRstr AccRstrDate
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
... ... ... ...
2368 NaN NaN NaN
2369 NaN NaN NaN
2370 NaN NaN NaN
2371 NaN NaN NaN
2372 "Credit Ural Bank" Joint Stock Compa... NaN NaN
[2373 rows x 28 columns]
столбцы DataFrame:
In [33]: df.columns
Out[33]:
Index(['BIC', 'NameP', 'CntrCd', 'Rgn', 'Ind', 'Tnp', 'Nnp', 'Adr', 'DateIn', 'PtType', 'Srvcs', 'XchType', 'UID',
'ParticipantStatus', 'Account', 'RegulationAccountType', 'CK', 'AccountCBRBIC', 'AccountStatus', 'RegN', 'Rstr',
'RstrDate', 'PrntBIC', 'SWBIC', 'DefaultSWBIC', 'EnglName', 'AccRstr', 'AccRstrDate'],
dtype='object')
все значения первой строки фрейма:
In [34]: pd.set_option("display.max_rows", 30)
In [35]: df.iloc[0]
Out[35]:
BIC 041280103
NameP УФК по Астраханской области
CntrCd RU
Rgn 12
Ind 414056
Tnp г
Nnp Астрахань
Adr ул Латышева, 6 Г
DateIn 2013-01-09
PtType 52
Srvcs 3
XchType 1
UID 1280002005
ParticipantStatus PSAC
Account 40116810600000010015
RegulationAccountType TRSA
CK 99
AccountCBRBIC 041280002
AccountStatus ACAC
RegN NaN
Rstr NaN
RstrDate NaN
PrntBIC NaN
SWBIC NaN
DefaultSWBIC NaN
EnglName NaN
AccRstr NaN
AccRstrDate NaN