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

标签: python pandas list dataframe group-by


【解决方案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}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2022-06-17
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多