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
我有一大堆 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