第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將xml解析為具有同級元素的表?

如何將xml解析為具有同級元素的表?

犯罪嫌疑人X 2023-06-27 18:29:35
我的 xml 看起來像這樣:xml = """<portfolio>    <assets>600000</assets>    <assetClassDetails>        <assetClassName>Bonds</assetClassName>        <assetAmount>100000</assetAmount>    </assetClassDetails>    <assetClassDetails>        <assetClassName>Equities</assetClassName>        <assetAmount>500000</assetAmount>    </assetClassDetails>    <rateOfReturn>6.3</rateOfReturn></portfolio>"""我通過這樣做將每個元素解析到一個表中:root = etree.fromstring(xml)tag = []text = []parent = []double_parent = []for element in root.iter():    try:        element_parent = element.getparent().tag    except AttributeError:        element_parent = 'none'    try:        element_double_parent = element.getparent().getparent().tag    except AttributeError:        element_double_parent = 'none'    tag.append(element.tag)    text.append(element.text)    parent.append(element_parent)    double_parent.append(element_double_parent)df = pd.DataFrame({'tag' : tag, 'text' : text, 'parent' : parent, 'double_parent' : double_parent})結果是這樣的:tag                 text      parent            double_parentportfolio           \n        none              noneassets              600000    portfolio         noneassetClassDetails   \n        portfolio         noneassetClassName      Bonds     assetClassDetails portfolioassetAmount         100000    assetClassDetails portfolioassetClassDetails   \n        portfolio         noneassetClassName      Equities  assetClassDetails portfolioassetAmount         500000    assetClassDetails portfoliorateOfReturn        6.3       portfolio         none我正在努力解決如何轉換數(shù)據(jù),以便將資產(chǎn)類別名稱和金額配對并綁定到投資組合標簽(及其直接子項)。如何在結果中配對同級標簽?我想要的結果如下所示:type        assets  rateOfReturn    assetClassName  assetAmountportfolio   600000  6.3             Bonds           100000portfolio   600000  6.3             Equities        500000
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經(jīng)驗 獲得超2個贊

嘗試類似的方法:


rows = []

columns = ['assets',  'rateOfReturn',    'assetClassName',  'assetAmount']

for entry in root.xpath('//assetClassDetails'):

    row = []

    row.extend([entry.xpath('preceding-sibling::assets/text()')[0],

                entry.xpath('following-sibling::rateOfReturn/text()')[0],

                entry.xpath('./assetClassName/text()')[0],

                entry.xpath('./assetAmount/text()')[0]])

    rows.append(row)

pd.DataFrame(rows,columns=columns)

輸出:


    assets  rateOfReturn    assetClassName  assetAmount

0   600000  6.3     Bonds   100000

1   600000  6.3     Equities    500000

另一種有趣的方法是使用另一個庫:


import pandas_read_xml as pdx

df1 = pdx.read_xml(r'path\to\myfile.xml',['portfolio','assetClassDetails'])

df2 = pdx.read_xml(r'path\to\myfile.xml',['portfolio'])

pd.concat([df2[['assets','rateOfReturn']],df1], axis=1)

輸出:


assets     rateOfReturn assetClassName  assetAmount

0   600000  6.3         Bonds             100000

1   600000  6.3         Equities        500000


查看完整回答
反對 回復 2023-06-27
?
肥皂起泡泡

TA貢獻1829條經(jīng)驗 獲得超6個贊

使用 @JackFleeting 提到的包的另一種方法可能是:


import pandas_read_xml as pdx

from pandas_read_xml import fully_flatten


df = (pdx.read_xml(r'path\to\myfile.xml', ['portfolio'])

      .pipe(fully_flatten))

展平將列表(XML 中的同級標簽)展開為單獨的行,或將字典(XML 中的子標簽)展開為單獨的列。


查看完整回答
反對 回復 2023-06-27
?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

下面(不使用任何外部庫)


import xml.etree.ElementTree as ET


xml = """

<portfolio>

    <assets>600000</assets>

    <assetClassDetails>

        <assetClassName>Bonds</assetClassName>

        <assetAmount>100000</assetAmount>

    </assetClassDetails>

    <assetClassDetails>

        <assetClassName>Equities</assetClassName>

        <assetAmount>500000</assetAmount>

    </assetClassDetails>

    <rateOfReturn>6.3</rateOfReturn>

</portfolio>

"""

data = []

root = ET.fromstring(xml)

global_properties = {'assets': root.find('assets').text, 'rateOfReturn': root.find('rateOfReturn').text,

                     'type': root.tag}

for asset in root.findall('.//assetClassDetails'):

    entry = {x.tag: x.text for x in list(asset)}

    for k, v in global_properties.items():

        entry[k] = v

    data.append(entry)

for entry in data:

    print(entry)

輸出


{'assetClassName': 'Bonds', 'assetAmount': '100000', 'assets': '600000', 'rateOfReturn': '6.3', 'type': 'portfolio'}

{'assetClassName': 'Equities', 'assetAmount': '500000', 'assets': '600000', 'rateOfReturn': '6.3', 'type': 'portfolio'}



查看完整回答
反對 回復 2023-06-27
  • 3 回答
  • 0 關注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號