web-dev-qa-db-ja.com

XMLファイルをPandas DataFrameに読み取ります

誰かが次のXMLファイルをPandasデータフレームに変換するのを手伝ってください:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
        <bathrooms type="dict">
                <n35237 type="number">1.0</n35237>
                <n32238 type="number">3.0</n32238>
                <n44699 type="number">nan</n44699>
        </bathrooms>
        <price type="dict">
                <n35237 type="number">7020000.0</n35237>
                <n32238 type="number">10000000.0</n32238>
                <n44699 type="number">4128000.0</n44699>
        </price>
        <property_id type="dict">
                <n35237 type="number">35237.0</n35237>
                <n32238 type="number">32238.0</n32238>
                <n44699 type="number">44699.0</n44699>
        </property_id>
</root>

次のようになります-

[〜#〜]出力[〜#〜]

これは私が書いたコードです:-

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

tree = ET.parse('real_state.xml')
root = tree.getroot()

dfcols = ['property_id', 'price', 'bathrooms']
df_xml = pd.DataFrame(columns=dfcols)

for node in root:
    property_id = node.attrib.get('property_id')
    price = node.attrib.get('price')
    bathrooms = node.attrib.get('bathrooms')

    df_xml = df_xml.append(
            pd.Series([property_id, price, bathrooms], index=dfcols),
            ignore_index=True)


print(df_xml)

実際の値ではなく、どこでもNoneを取得しています。誰かがそれをどのように修正できるか教えてください。ありがとう!

4
Sarthak Girdhar

このようにデータが単純な場合、次のようなことができます。

from lxml import objectify
xml = objectify.parse('Document1.xml')
root = xml.getroot()

bathrooms = [child.text for child in root['bathrooms'].getchildren()]
price = [child.text for child in root['price'].getchildren()]
property_id = [child.text for child in root['property_id'].getchildren()]

data = [bathrooms, price, property_id]
df = pd.DataFrame(data).T
df.columns = ['bathrooms', 'price', 'property_id']

    bathrooms   price      property_id
0   1.0        7020000.0    35237.0
1   3.0        10000000.0   32238.0
2   nan        4128000.0    44699.0

より複雑な場合は、ループの方が適しています。あなたは次のようなことができます

from lxml import objectify
xml = objectify.parse('Document1.xml')
root = xml.getroot()

data=[]
for i in range(len(root.getchildren())):
    data.append([child.text for child in root.getchildren()[i].getchildren()])

df = pd.DataFrame(data).T
df.columns = ['bathrooms', 'price', 'property_id']
4
Chris

xmltodict パッケージからこの関数を使用して成功しました:

import xmltodict

xmlDict = xmltodict.parse(xmlData)
df = pd.DataFrame.from_dict(xmlDict)

これについて私が気に入っているのは、xmlの解析とdfの作成の間に辞書操作を簡単に実行できることです。また、構造がうまく機能していない場合は、データを辞書として調査するのに役立ちます。

0
Correy Koshnick