【问题标题】:Pandas Dataframe: Splitting Columns containing lists of dictionariesPandas Dataframe:拆分包含字典列表的列
【发布时间】:2021-10-04 23:32:14
【问题描述】:

我们面临的挑战是我们有一个数据框patents_original,其中列由字典列表组成。每个字典都包含重复出现的键,例如'inventor_last_name'。

[{'inventor_last_name': 'Han', 'inventor_first_name': 'Shu-Jen', 'inventor_country': 'US', 'inventor_key_id': '104654'}, {'inventor_last_name': 'Chen', 'inventor_first_name': 'Chia-Yu', 'inventor_country': 'US', 'inventor_key_id': '367934'}]

我们正在寻找仅包含重复键项的列。这样一行中的每个'inventor_last_name' 都列在一个名为'inventor_last_name' 的新列中(当包含多个投资者时,他们的所有姓氏都应列在一个名为“inventor_last_name”的列中)。对于下面的分析,不改变行从属关系是非常重要的。新的数据框随后应包含 4 个新列,分别称为 'inventor_last_name'、'inventor_first_name'、'inventor_country' 和 'inventor_key_id'(先前字典的键)。

堆栈溢出提供了这个代码片段来创建一个新列并用键"inventor_last_name"的项目填充它:

patents_inventors["inventor_last_name"] = [sub_dict["inventor_last_name"] for sub_dict in patents_inventors["inventors"]]

出现以下错误:

patents_inventors["inventor_last_name"] = [ sub_dict["inventor_last_name"] for sub_dict in patents_inventors["inventors"]]
Traceback (most recent call last):

  File "<ipython-input-46-2c776eb8a76d>", line 1, in <module>
    patents_inventors["inventor_last_name"] = [ sub_dict["inventor_last_name"] for sub_dict in patents_inventors["inventors"]]

  File "<ipython-input-46-2c776eb8a76d>", line 1, in <listcomp>
    patents_inventors["inventor_last_name"] = [ sub_dict["inventor_last_name"] for sub_dict in patents_inventors["inventors"]]

TypeError: string indices must be integers

对于我们来说,作为绝对的 Python 爱好者,Python 似乎不会将该行解释为字典列表。将该列传输到数据类型列表或字典的所有尝试都失败了。

如果有帮助,我可以为您提供可编辑 Excel 工作表的链接!

这是我们关于堆栈溢出的第一篇文章,所以如果它是这样的,请多多包涵。我们非常感谢您的帮助!

编辑:

列名是:

patent_number
patent_title
patent_abstract
patent_date
patent_num_combined_citations
patent_num_cited_by_us_patents
inventors
assignees
applications
cited_patents
citedby_patents
cpcs
wipos

由于我不太确定如何缩短数据框以在此处发布,因此我将图片链接到相应的 Excel 工作表。希望这也有帮助。

exerpt of the corresponding excel sheet

【问题讨论】:

  • 不清楚数据框的实际结构。请澄清,添加一些样本等。
  • 数据框本身的形状为[36015 rows x 14 columns],主要包含对象形式的专利数据。由于这些列的结构与发明人的方式相似,因此该列针对剩余的 df 进行了描述。希望这会有所帮助!
  • 列名是什么?如果您可以创建一个复制问题的小型人工样本,那将是最好的。使其可复制粘贴。
  • 嗨 Timus,我不熟悉在堆栈溢出时发布 df,因为 df 太大了stackoverflow.com/questions/20109391/… 帮不了我那么多。我编辑了这个问题,希望对您有所帮助。提前谢谢!

标签: python list dataframe dictionary split


【解决方案1】:

我个人更喜欢在这些情况下使用 apply,因为它增加了可读性。根据您的问题,我不确定它是否是嵌套列表。

更新: 字符串类型意味着您首先需要将对象解析为字典。

import json
patents_inventors['parsed_inventors'] = patents_inventors['inventors'].apply(lambda x: [json.loads(y) for y in x])

patents_inventors['inventor_last_name'] = patents_inventors['parsed_inventors'].apply(lambda x: [y['inventor_last_name'] for y in x])

【讨论】:

  • 两个代码片段导致相同的错误。 TypeError: string indices must be integers 我想我们的主要问题之一是,我们不太确定专栏的结构。 .dtypes 表明它是一个对象,但由于我们对 python 还很陌生,我们不确定如何处理这些信息,也无法将其转换为不同的类型,如列表。
  • 检查对象的类型,因为它可能是一个字符串,你必须先解析它
  • 这是 type 函数输出的样子。 [&lt;class 'str'&gt;, &lt;class 'str'&gt;, &lt;class 'str'&gt;, &lt;class 'str'&gt;, ... , &lt;class 'str'&gt;]我不太清楚如何解释这些信息。供您参考,该数据框是通过专利视图的 api 请求收到的。
  • 亲爱的乔里,问题又变了。在我们将 JSON 解码方式从results = r.json 更改为results = json.loads(r.text) 后,新的错误如下TypeError: the JSON object must be str, bytes or bytearray, not dict。你对如何处理这个问题有任何线索吗?感谢您的帮助!
猜你喜欢
  • 2022-10-13
  • 2018-04-07
  • 2015-04-11
  • 2022-12-03
  • 2021-08-30
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多