pandas groupby 嵌套结构

pandas groupby with nested struct

我有一大堆 JSON 数据已加载到 Pandas 中,但数据的一个重要部分是一个嵌套结构,它具有一组动态的键和值。我想要做的是尝试能够在进行分组后包含该数据,或者能够基于该嵌套结构执行一般统计。

数据看起来像:

[
    {
        "error_count": 1,
        "id": "abcdef",
        "common_id": "A",
        "date": "2022-01-01",
        "errors": {
            "error1": "5",
        }
    },
    {
        "error_count": 2,
        "id": "ghijkl",
        "common_id": "A",
        "date": "2022-01-02",
        "errors": {
            "error7": "2",
            "error32": "2"
        }
    },
    ...
]

我正在尝试生成一个 table,它可以按 common_id 分组,然后按 id 分组,然后显示各个错误和错误值,但嵌套的结构键是动态的每条记录都可以不同。

我也在尝试生成这些动态错误的 table 以及每个错误有多少条记录,可能使用 groupby() 按日期分组。

数据最初在 Spark 中,但我发现 pyspark a 但令人困惑,所以我试图将数据加载到 pandas 中,因为我认为它会更容易。

在过去的几天里,我一直在尝试尽可能多地阅读有关 pandas 的内容,但恐怕此时我已经迷路了。也许我问的问题不对,但我希望比我聪明的人能帮助我指明正确的方向。

期望输出:

第一个 table:

common_id    id      error    error_val
A            abcdef  error1   5
             ghijkl  error7   2
                     error32  2

第二个像这样 table:

common_id    id      error    error_count
A            abcdef  error1   1
             ghijkl  error7   1
                     error32  1

或:

error    error_val    record_count
error1   5            1
error7   2            1
error32  2            1

或:

error    record_count
error1   1
error7   1
error32  1

对于第一个输出,您可以使用 json_normalize 将您的词典列表(我在下面命名为 data)展平为 table;然后 melt 它。其余的是为了获得所需形式的输出而进行的外观更改:

first = pd.melt(pd.json_normalize(data).drop(columns=['error_count', 'date']), 
              id_vars=['common_id', 'id'], 
              var_name='error', value_name='error_val').dropna().reset_index(drop=True)
first['error'] = first['error'].str.split('.').str[1]

输出:

  common_id      id    error error_val
0         A  abcdef   error1         5
1         A  ghijkl   error7         2
2         A  ghijkl  error32         2

对于第二个输出,您可以使用在上述步骤中创建的 DataFrame(我将其命名为 first)并使用 groupby + count:

second = first.groupby(['common_id', 'id', 'error'])['error_val'].count().reset_index(name='error_count')

输出:

  common_id      id    error  error_count
0         A  abcdef   error1            1
1         A  ghijkl  error32            1
2         A  ghijkl   error7            1