Я хочу создать специально отформатированный XML-файл из заданного фрейма данных pandas. Мой фрейм данных выглядит примерно так -

Doc_ID      Doc_Name       Doc_Category

abc123      aaa111            c1
abc456      aaa222            c2

И я хочу отформатировать такой набор данных, содержащий 10 тыс. Строк, в один XML-файл в формате -

<DOC>
<DOCNO> abc123 </DOCNO>
<TEXT> aaa111 + c1 </TEXT>  ### Combines strings from 2 columns
</DOC>

<DOC>
<DOCNO> abc456 </DOCNO>
<TEXT> aaa222 + c2 </TEXT>  ### Combines strings from 2 columns
</DOC>

Я пытался использовать что-то подобное, но мне не удалось объединить их все в один XML-файл.

for i,row in testdoc.iterrows():
    xml =['<DOC>']
    xml.append('<{0}>{1}</{0}>'.format("DocNO", row["Doc_ID"]))
    xml.append('<{0}>{1}</{0}>'.format("Text", row["Doc_Name"]+row['Doc_Category']))
    xml.append('</DOC>')

Как я могу это сделать? Было бы неплохо иметь и обработчик недопустимых символов.

Благодарность!

2
Soumya Ranjan Sahoo 7 Окт 2020 в 15:04

2 ответа

Лучший ответ
import pandas as pd

df = pd.DataFrame({
    'Doc_ID': ['abc123', 'abc456'],
    'Doc_Name': ['aaa111', 'aaa222'],
    'Doc_Category': ['c1', 'c2']
})

def func(row):
    xml = ['  <DOC>']
    xml.append('    <DOCNO>{0}</DOCNO>'.format(row['Doc_ID']))
    xml.append('    <TEXT>{0}{1}</TEXT>'.format(row['Doc_Name'], row['Doc_Category']))
    xml.append('  </DOC>\n')
    return '\n'.join(xml)

xml = '<DOCS>\n' + ''.join(df.apply(func, axis = 1)) + '</DOCS>'
print(xml)

Выход:

<DOCS>
  <DOC>
    <DOCNO>abc123</DOCNO>
    <TEXT>aaa111c1</TEXT>
  </DOC>
  <DOC>
    <DOCNO>abc456</DOCNO>
    <TEXT>aaa222c2</TEXT>
  </DOC>
</DOCS>
1
Alexandra Dudkina 7 Окт 2020 в 12:27

Пытаться

import pandas as pd

df = pd.DataFrame(
    [{'doc_id': 1, 'doc_name': 'jack', 'doc_cat': '__abc__'}, {'doc_id': 11, 'doc_name': 'ben', 'doc_cat': '$$abc$$'}])
d = df.to_dict(orient='list')
xml = '<ROOT>'
for idx, x in enumerate(d['doc_id']):
    xml += '<DOC>'
    xml += f'<DOCNO>{x}</DOCNO>'
    xml += f'<TEXT>{d["doc_cat"][idx]}{d["doc_name"][idx]}</TEXT>'
    xml += '</DOC>'
xml += '</ROOT>'
print(xml)

Выход

<ROOT>
    <DOC>
        <DOCNO>1</DOCNO>
        <TEXT>__abc__jack</TEXT>
    </DOC>
    <DOC>
        <DOCNO>11</DOCNO>
        <TEXT>$$abc$$ben</TEXT>
    </DOC>
</ROOT>
2
balderman 7 Окт 2020 в 12:39