gpt4 book ai didi

python /R : generate dataframe from XML when not all nodes contain all variables?

转载 作者:太空狗 更新时间:2023-10-29 21:02:29 24 4
gpt4 key购买 nike

考虑以下 XML 示例

library(xml2)

myxml <- read_xml('
<data>
<obs ID="a">
<name> John </name>
<hobby> tennis </hobby>
<hobby> golf </hobby>
<skill> python </skill>
</obs>
<obs ID="b">
<name> Robert </name>
<skill> R </skill>
</obs>
</data>
')

在这里,我想从此 XML 中获取一个(R 或 Pandas)数据框,其中包含列 namehobby

但是,如您所见,存在对齐问题,因为第二个节点中缺少 hobby,而 John 有两个爱好。

在 R 中,我知道如何一次提取一个特定值,例如使用 xml2 如下:

myxml%>% 
xml_find_all("//name") %>%
xml_text()

myxml%>%
xml_find_all("//hobby") %>%
xml_text()

但是我怎样才能在数据框中正确对齐这些数据呢?也就是说,我如何获得如下数据框(注意我是如何加入 | John 的两个爱好):

# A tibble: 2 × 3
name hobby skill
<chr> <chr> <chr>
1 John tennis|golf python
2 Robert <NA> R

在 R 中,我更喜欢使用 xml2dplyr 的解决方案。在 Python 中,我想以 Pandas 数据框结束。此外,在我的 xml 中还有更多我想要解析的变量。我想要一个解决方案,它允许用户解析额外的变量,而不会对代码造成太多干扰。

谢谢!

编辑:感谢大家提供这些出色的解决方案。所有这些都非常好,有很多细节,很难挑选出最好的。再次感谢!

最佳答案

不需要对变量进行硬编码的通用 R 解决方案。
使用 xml2 和 tidyverse 的 purrr:

library(xml2)
library(purrr)

myxml %>%
xml_find_all('obs') %>%
# Enter each obs and return a df
map_df(~{

# Scan names
node_names <- .x %>%
xml_children() %>%
xml_name() %>%
unique()

# Remember ob
ob <- .x

# Enter each node
map(node_names, ~{

# Find similar nodes
node <- xml_find_all(ob, .x) %>%
xml_text(trim = TRUE) %>%
paste0(collapse = '|') %>%
'names<-'(.x)
# ^ we need to name the element to
# overwrite it with its 'sibilings'

}) %>%
# Return an 'ob' vector
flatten()
})

#> # A tibble: 2 × 3
#> name hobby skill
#> <chr> <chr> <chr>
#> 1 John tennis|golf python
#> 2 Robert <NA> R

它的作用:

  1. 它“输入”每个 obs,查找并存储该 obs 中的节点名称。
  2. 对于每个节点,在 obs 中找到所有相似的节点,折叠它们并存储在列表中。
  3. 展开列表,覆盖同名元素。
  4. rbind(隐含在 map_df() 中)每个“扁平化”列表到生成的 data.frame 中。

数据:

myxml <- read_xml('
<data>
<obs ID="a">
<name> John </name>
<hobby> tennis </hobby>
<hobby> golf </hobby>
<skill> python </skill>
</obs>
<obs ID="b">
<name> Robert </name>
<skill> R </skill>
</obs>
</data>
')

关于 python /R : generate dataframe from XML when not all nodes contain all variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com