按两个参数对字典列表进行分组并计算分组值

Posted

技术标签:

【中文标题】按两个参数对字典列表进行分组并计算分组值【英文标题】:Group list of dicts by two params and count grouped values 【发布时间】:2022-01-15 08:19:19 【问题描述】:

我有带有 id 编号的字典列表,我需要按 main_idsecond_id 对其进行分组,并计算每个组中的值。达到此目的的最佳 Python 方法是什么?

我尝试过使用 Pandas,但没有得到包含组和计数的 dict

df = pd.DataFrame(data_list)
df2 = df.groupby('main_id').apply(lambda x: x.set_index('main_id')['second_id']).to_dict()
print(df2)

列表如下:

[
    
        "main_id":34,
        "second_id":"2149"
    ,
    
        "main_id":82,
        "second_id":"174"
    ,
    
        "main_id":24,
        "second_id":"4QCp"
    ,
    
        "main_id":34,
        "second_id":"2149"
    ,
    
        "main_id":29,
        "second_id":"126905"
    ,
    
        "main_id":34,
        "second_id":"2764"
    ,
    
        "main_id":43,
        "second_id":"16110"
    
]

我需要这样的结果:

[

    "main_id":43,
    "second_id":"16110",
    "count": 1
,

    "main_id":34,
    "second_id":"2149",
    "count": 2

]

【问题讨论】:

你看过itertools.groupby了吗? *** 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :) @chepner groupby() 将同一组中的连续元素分组。除非她先对列表进行排序,否则这些组不会是连续的。 @Barmar 当然,groupby 的文档中特别提到了这一点。我从来没有说过像groupby(the_list) 这样简单的话就是答案。 您可以将列表转换为 pandas 数据框并使用其分组和计数方法。 【参考方案1】:

您可以使用collections(来自标准库)代替 pandas。我将字典列表分配给xs

import collections

# create a list of tuples; each is (main_id, secondary_id)
ids = [ (x['main_id'], x['second_id']) for x in xs ]

# count occurrences of each tuple
result = collections.Counter(ids)

最后,result 是一个 dict,可以很容易地转换为最终形式(未显示)。

Counter((34, '2149'): 2,
         (82, '174'): 1,
         (24, '4QCp'): 1,
         (29, '126905'): 1,
         (34, '2764'): 1,
         (43, '16110'): 1)

【讨论】:

【参考方案2】:

您可以使用pandas.DataFrame.groupby.size 测量每个组的大小并将其转换回字典:

out = list(pd.DataFrame(data_list).groupby(['main_id','second_id']).size().reset_index().rename(0:'count', axis=1).T.to_dict().values())

输出:

['main_id': 24, 'second_id': '4QCp', 'count': 1,
 'main_id': 29, 'second_id': '126905', 'count': 1,
 'main_id': 34, 'second_id': '2149', 'count': 2,
 'main_id': 34, 'second_id': '2764', 'count': 1,
 'main_id': 43, 'second_id': '16110', 'count': 1,
 'main_id': 82, 'second_id': '174', 'count': 1]

【讨论】:

以上是关于按两个参数对字典列表进行分组并计算分组值的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式

按对象 ID 对字典 NSFetchRequest 进行分组

我可以使用 PDO::FETCH_GROUP 按两个值对结果进行分组吗

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

GroupBy 两个变量,其中一个来自嵌套列表

如何按列对pyspark中的数据框进行分组并以该列作为键并以记录列表作为其值来获取字典?