将字典列表解压缩到 Pandas 中的单独列中

Posted

技术标签:

【中文标题】将字典列表解压缩到 Pandas 中的单独列中【英文标题】:Unpack list of dictionary into separate columns in Pandas 【发布时间】:2021-02-15 16:53:06 【问题描述】:

假设我的数据结构如下:

 
    "_id" : 245, 
    "connId" : "3r34b32", 
    "roomList" : [
        
            "reportId" : 29, 
            "siteId" : 1
        ]

如何从列表中的字典中获取键以及值,以使其在下面具有预期的输出。

预期输出:

ID,connID,reportId,siteId

245,3r34b32,29,1

我正在使用json_normalize,但这不适用于列表,因此我需要添加一些额外的代码来解压缩包含字典的列表。

我们将不胜感激。

【问题讨论】:

检查pd.json_normalize(dct, 'roomList', ['_id', 'connId']) 除了明确指定列名之外,还有其他选择吗?因为代码需要以一种自动化的方式编写 你指的是哪一栏? roomList,但是,它需要以不需要指定列名的方式完成,因此它将是动态的 是否保证每个数据字典始终存在一个记录列表?因此,例如在这种情况下,只有一个记录列表与数据字典中的键 roomList 相关联。 【参考方案1】:

您有一个嵌套记录。您可以使用record_path 单独处理它们,并将它们与pd.concat() 连接起来

root = pd.json_normalize(d).drop('roomList',1)
nested = pd.json_normalize(d, record_path='roomList')
output = pd.concat([root, nested],axis=1)
print(output)
   _id   connId  reportId  siteId
0  245  3r34b32        29       1

没有明确列名的方法

如果您不想明确指定列名,可以执行以下操作。这会检查归一化后的哪些列是嵌套的,分别对它们进行归一化并连接所有列。为了举例,我添加了另一个嵌套的 JSON -

root = pd.json_normalize(d)
nested_cols = [i for i in root.columns if isinstance(root[i][0], list)]

l = [root.drop(nested_cols,1),]
for i in nested_cols:
    l.append(pd.json_normalize(d, record_path=i))

output = pd.concat(l, axis=1)
print(output)
   _id   connId  reportId  siteId  reportId2  siteId2
0  245  3r34b32        29       1         39        5

注意:如果您的一些嵌套记录具有相同的名称,您可能希望在规范化它们时使用一些前缀。 Check this 了解更多详情。

【讨论】:

很高兴随时提供帮助。 @AkshaySehgal 检查所有列中第一个条目的类型的非常聪明的想法...在列表理解中,您可以使用更首选的类型检查方式,即 isisinstance(root[i][0], list) 而不是 @987654329 @ :) 很好的意见,我想知道我是否应该做出改变,但我太懒了:)

以上是关于将字典列表解压缩到 Pandas 中的单独列中的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas Column 解压字典

在pandas dataframe列中解压缩并打印元组

Python Pandas:如何将列中的分组列表作为字典返回

如何解压缩数据框列中存在的 json 的键,值将转换为键作为列,而使用 python 将其值转换为列?

批处理winrar命令 ,如何批量解压缩到每个单独的文件夹?

Pandas 数据框以列中的唯一值作为键,嵌套列表作为值