在 Pandas 中分解和解压列

问题描述

假设我有下面这种结构的数据,如何分解包含列表的列然后解压分解的列?

来源:

d = { 
    "_id" : "5f2","connId" : 128,"hospitalList" : [
        {
            "hospitalId" : 29,"boardId" : 1019,"siteId" : 1
        },{
            "hospitalId" : 3091,"boardId" : 2163,"siteId" : 382
        },{
            "hospitalId" : 28,"boardId" : 1017,"siteId" : 5
        }]
    }

代码

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  hospitalId       boardId  siteId
0                       5f2       128.0          29         1019       1
1                       NaN         NaN        3091         2163     382
2                       NaN         NaN          28         1017       5

预期结果:

                        _id      connId  hospitalId      boardId  siteId
0                       5f2       128.0          29         1019       1
1                       5f2       128.0        3091         2163     382
2                       5f2       128.0          28         1017       5

解决方法

这会输出您想要的内容。

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)

output.fillna(method='ffill',inplace=True)

不过,不幸的是,我不知道您将在什么情况下使用该代码,和/或您是否需要进行调整。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...