【问题标题】:How to denormalize YAML for Pandas Dataframe?如何为 Pandas Dataframe 非规范化 YAML?
【发布时间】:2019-06-13 00:39:24
【问题描述】:

我正在尝试将 YAML 文件中的数据获取到 Pandas DataFrame 中。以data.yml为例:

---
 - doc: "Book1"
   reviews:
     - reviewer: "Paul"
       stars: "5"
     - reviewer: "Sam"
       stars: "2"
 - doc: "Book2"
   reviews:
     - reviewer: "John"
       stars: "4"
     - reviewer: "Sam"
       stars: "3"
     - reviewer: "Pete"
       stars: "2"
...

所需的 DataFrame 如下所示:

     doc reviews.reviewer reviews.stars
0  Book1             Paul             5
1  Book1              Sam             2
2  Book2             John             4
3  Book2              Sam             3
4  Book2             Pete             2

我尝试以不同的方式将 YAML 数据提供给 Pandas(例如 with open('data.yml') as f: data = pd.DataFrame(yaml.load(f))),但单元格始终包含嵌套的字典。这个solution works for general JSON data,但它是相当多的代码,看起来可能存在一个更简单的 YAML 解决方案。

是否有内置的或 Pythonic 的方法来非规范化 YAML 以便以这种方式转换为 Pandas 数据框?

【问题讨论】:

  • 避免在 cmets 中回答问题。
  • 难道你不能使用 pyyaml 之类的东西将 yaml 作为对象读取,然后将其加载到 df 中吗?
  • “似乎存在一个更简单的 YAML 解决方案” 你为什么这么认为,因为 YAML 是 JSON 的超集,而 YAML 的解析器至少要复杂一个数量级?你没有说明你是如何到达yaml的,但如果那是PyYAML模块,那么使用yaml.load()既没有必要也有潜在的危险。
  • 能否告诉我json_normalize 是否解决了您的问题?
  • @coldspeed 是的,确实如此,因此获得了赞成票(我想这个问题的措辞足够好,可以赞成吗?)。为我节省了很多时间。我喜欢在标记为已回答前几天提出问题,以防其他人有不同的方式,但我可能会在周末结束前将你的标记为已接受。非常感谢您的帮助。

标签: python pandas dataframe yaml denormalization


【解决方案1】:

您应该在 YAML 加载后使用 json_normalize 来展平字典:

pd.io.json.json_normalize(yaml.load(f), 'reviews', 'doc')

  reviewer stars    doc
0     Paul     5  Book1
1      Sam     2  Book1
2     John     4  Book2
3      Sam     3  Book2
4     Pete     2  Book2

【讨论】:

    【解决方案2】:

    现在使用上面会导致 FutureWarning:pandas.io.json.json_normalize 已弃用,请改用 pandas.json_normalize

    # lets say the yaml file is test_sample.yml
    from pandas import json_normalize
    from os import getcwd, path
    from yaml import SafeLoader, load
    
    path_to_yaml = path.join(getcwd(), ..., "test_sample.yaml")
    with open(path_to_yaml) as yaml_file:
        yaml_contents = load(path_to_file, Loader=SafeLoader)
    yaml_df = json_normalize(yaml_contents)
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2013-09-06
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2016-05-13
      • 2018-06-06
      相关资源
      最近更新 更多