Pandas Dataframe:拆分包含字典列表的列

时间:2021-07-29 09:48:01

标签: python list dataframe dictionary split

我们面临的挑战是我们有一个数据框 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

1 个答案:

答案 0 :(得分:0)

我个人更喜欢在这些情况下使用 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])