Python Pandas: 在迭代器上使用 map 函数

Python Pandas: use map function on iterator

对于你们中的一些人来说,这可能是一个简单的问题。

我正在解析一棵 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: 示例 XML 可以在 tutorial of the ElementTree.

中找到

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

没有什么可以成为您不了解正在解析的文档的结构的借口。使用您引用的示例,您可以结合使用列表和字典理解将某些内容传递给 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

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

flat_list = list(root.iter())

然后从中创建一个 DataFrame。

这是完整的片段:

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))

(link 到 xml file)