Pandas json_normalize:访问库和数组形式的数据

Pandas json_normalize:访问库和数组形式的数据,pandas,Pandas,我试图在下面的嵌套json中提取'Resource'的值 { "Statement": [ { "Effect": "A-----------", "Action": [ "logs:C-----------", "logs:P-----------&q

我试图在下面的嵌套json中提取'Resource'的值

{
    "Statement": [
        {
            "Effect": "A-----------",
            "Action": [
                "logs:C-----------",
                "logs:P-----------"
            ],
            "Resource": [
                "a----",
                "b----",
                "c----"
            ]
        }
        {
            "Effect": "A-----------",
            "Action": "l-----------p",
            "Resource": "a-----------*"
        },
        {
            "Effect": "A-----------",
            "Action": [
                "-----------",
                "l-----------"
            ],
            "Resource": [
                "a----",
                "b----"
            ]
        }
    ]
}
如您所见,对于第一个和第三个示例,“资源”信息位于数组
“资源”:[“值”]
中,而第二个是库形式
{“资源”:“值”}

在我从中提取信息的实际json文件中,大多数“资源”数据都是数组形式。

我可以通过以下代码获取阵列的信息:

df = pd.json_normalize(response['Document']['Statement'], record_path=['Resource'])
但是,由于库形式中的“资源”位于数组形式中的两个资源之间,因此会出现以下错误:

TypeError(TypeError:{'Resource':'---'}具有路径资源的非列表值---。必须是list或null。

我知道我可以使用下面的代码访问库信息,但我希望一次性获得所有“资源”实例的信息

table_df = pd.json_normalize(response['Statement'])
table_df = table_df.reindex(columns=['Resource'])

我可以用什么方法来解决这个问题?

您不需要熊猫来操作json

import pandas as pd

data = {
    "Statement": [
        {
            "Effect": "A-----------",
            "Action": [
                "logs:C-----------",
                "logs:P-----------"
            ],
            "Resource": [
                "a----",
                "b----",
                "c----"
            ]
        },
        {
            "Effect": "A-----------",
            "Action": "l-----------p",
            "Resource": "a-----------*"
        },
        {
            "Effect": "A-----------",
            "Action": [
                "-----------",
                "l-----------"
            ],
            "Resource": [
                "a----",
                "b----"
            ]
        }
    ]
}

resource = list()
for statement in data['Statement']:
    if isinstance(statement['Resource'], list):
        resource.extend(statement['Resource'])
    else:
        resource.append(statement['Resource'])
df = pd.Series(resource)
然后,您将得到一个如下所示的系列:

df
0            a----
1            b----
2            c----
3    a-----------*
4            a----
5            b----
dtype: object

这是一个简单但非常有效的解决方案。谢谢!我在使用此解决方案时发现了一个新问题。请查看主帖子中的编辑。我将尝试在“”上拆分列表,但我暂时不发布此帖子,以防有更优雅的解决方案。@ire为新问题编辑。。太棒了。谢谢:)