Python通过Groupby实现分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python通过Groupby实现分组相关的知识,希望对你有一定的参考价值。

参考技术A 如果有对list里的元素按照某个字段进行分组的需求的话,可以通过itertools模块中的groupby实现。

举例,list中包含3个元素,希望通过country字段进行分组,再按组操作,通过itemgetter可以取dict中key。

效果:

也可以通过lambda取dict中的字段。

除此之外,还可以实现自定义分组

效果:

LINQ技巧:如何通过多次调用GroupBy实现分组嵌套

问题如上,解决如下,目标在最下面:结果: 

using System;
using System.Linq;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        public class Sdata
        {
            public string gather;
            public int shotcount;

        }

        static void Main(string[] args)
        {
            var m = new[]{
                new Sdata{gather = "100002",shotcount = 28},
                new Sdata{gather = "100002", shotcount =44},
                new Sdata{gather = "100003", shotcount = 8},
                new Sdata{gather = "100003", shotcount = 20},
                new Sdata{gather = "100004", shotcount = 55},
                new Sdata{gather = "100004", shotcount = 60},
                new Sdata{gather = "100005", shotcount = 10},
                new Sdata{gather = "100005", shotcount = 60},
                new Sdata{gather = "100006", shotcount = 24},
                new Sdata{gather = "100006", shotcount = 75},
                new Sdata{gather = "100010", shotcount = 41},
                new Sdata{gather = "100010", shotcount = 81},
                new Sdata{gather = "100012", shotcount = 75},
                new Sdata{gather = "100012", shotcount = 100},
            };

            var q2 =
                from s in m
                group s by s.gather into gatherGroup
                select new
                {
                    gather = gatherGroup.Key,
                    shotcountGroups =
                        from s2 in gatherGroup
                        group s2 by s2.shotcount into shotcountGroups
                        select new
                        {
                            shotcount = shotcountGroups.Key,
                            //Days =
                            //    from s3 in shotcountGroups
                            //    orderby s3.Day
                            //    select s3.Day
                        }
                };

            foreach(var item in q2)
            {
                Console.WriteLine("1gather={0}",item.gather);
                foreach(var itme2 in item.shotcountGroups)
                {
                    Console.WriteLine("\\tshotcount = {0}",itme2.shotcount);
                }
            }

            var q = m.GroupBy(
                    s => s.gather,
                    (gather, gatherGroup) => new
                    {
                        gather,
                        shotcountGroups =
                            gatherGroup.GroupBy(
                                s2 => s2.shotcount,
                                (shotcount, shotcountGroups) => new
                                {
                                    shotcount,
                                    //Days = shotcountGroups.OrderBy(s3 => s3.Day).Select(s3 => s3.Day)
                                }
                            )
                    }
                );

            List<object> listobj = new List<object>();
            List<object> obj = new List<object>();
            foreach (var elem in q)
            //foreach (var elem in q2) 
            {
                int tc = elem.shotcountGroups.Count();
                var d=new List<object>() ;
                
                Console.WriteLine("2gather = {0}", elem.gather);
                d.Add(elem.gather);
                foreach (var elem2 in elem.shotcountGroups)
                {
                    Console.WriteLine("\\tshotcount = {0}", elem2.shotcount);
                    //foreach (var day in elem2.Days)
                    //    Console.WriteLine("\\t\\tDay = {0}", day);
                    d.Add(elem2.shotcount);
                }
                Console.WriteLine("eachobj is {0}",d.Count());
                listobj.Add(d);
            }
            Console.WriteLine("listobj is {0}", listobj.Count);


            foreach (var mdata in listobj)
            {
                Console.WriteLine("listobj is {0}", listobj.ToList());
            }

            Console.Read();
        }
    }
}

 

gather = 100002
  shotcount = 28
  shotcount = 44
gather = 100003
  shotcount = 8
  shotcount = 20
gather = 100004
  shotcount = 55
  shotcount = 60
gather = 100005
  shotcount = 10
  shotcount = 60
gather = 100006
  shotcount = 24
  shotcount = 75
gather = 100010
  shotcount = 41
  shotcount = 81
gather = 100012
  shotcount = 75
  shotcount = 100

以上是关于Python通过Groupby实现分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程(第2版)第3章 聚合与排序:3-2 对表进行分组

Group by

Python数据分析第二篇--数据计算

Python数据分析分组统计groupby

100天精通Python(数据分析篇)——第64天:Pandas分组groupby函数案例

LINQ技巧:如何通过多次调用GroupBy实现分组嵌套