【问题标题】:Python Pandas: use map function on iteratorPython Pandas:在迭代器上使用 map 函数
【发布时间】:2018-01-19 05:30:31
【问题描述】:

也许对你们中的一些人来说是一个简单的问题。

我正在解析一个 XML 树,它具有相当复杂的嵌套结构。这是代码的一部分:

import xml.etree.ElementTree as ET
import pandas as pd
from bs4 import BeautifulSoup as BS

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

for unit in root.iter('xml_element_name'):
    # do something with the unit

但我想摆脱 for-each 迭代,因为我想使用地图功能(例如 Pandas.Series.map 或 Pandas.Dataframe.map 或任何类似的)。所以这是我想要实现的伪代码:

items = pd.Series(root.iter('xml_element_name'))
df = pd.Dataframe(items.map(lambda unit: ....))

但是怎么做呢?有什么想法吗?

PS:可在tutorial of the ElementTree 中找到示例 XML。

为什么我要这样做?因为我想稍后切换到 PySpark,以便并行处理每个 XMLElement(单元)。

【问题讨论】:

    标签: python xml pandas iterator map-function


    【解决方案1】:

    您可以尝试通过以下方式从迭代器中创建平面数据结构:

    flat_list = list(root.iter())
    

    然后用它创建一个DataFrame。

    这是完整的 sn-p:

    import xml.etree.ElementTree as ET
    import pandas as pd
    from bs4 import BeautifulSoup as BS
    import pdb
    
    tree = ET.parse('cd_catalog.xml')
    root = tree.getroot()
    
    flat_list = list(root.iter())
    df        = pd.DataFrame({'xml_elements':flat_list})
    
    # do some arbitrary computation on the df:
    result = df.xml_elements.map(lambda x: x.text) 
    print(result.head(n=3))
    

    (链接到xml file

    【讨论】:

    • 这行得通。尽管在第一次运行时拆分第一个元素(层次结构)是个好主意。这意味着您在调用 root.iter() 时可以获得多个列,从而创建字典或系列。
    【解决方案2】:

    没有什么可以让您了解正在解析的文档的结构。通过您引用的示例,您可以使用列表和字典理解的组合将某些内容传递给 pd.DataFrame 构造函数。

    希望这能给你和想法

    pd.DataFrame([
        {a.tag: a.text for a in c if a.tag != 'neighbor'}
        for c in root.findall('country')
    ])
    
        gdppc rank  year
    0  141100    1  2008
    1   59900    4  2011
    2   13600   68  2011
    

    【讨论】:

    • 不是一个简单的代码。尤其是您使用的数据框的构造函数。但我理解我猜。备注:我正在解析的 XML 有点复杂。顺便说一句:您的代码仍在构造函数中使用 for-each。
    • @Matthias 但一般来说,理解似乎更快。同样,map 也是如此。
    • 我最终使用了你的代码,而上面的另一个也可以。 df = pd.DataFrame([(child.tag, child.attrib) for child in root.iter('country')])df.columns = ['tag', 'attributes']
    猜你喜欢
    • 2013-05-20
    • 2017-10-08
    • 2014-09-01
    • 1970-01-01
    • 2020-10-18
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多