Выберите несколько групп из объекта pandas groupby

Я экспериментирую с групповыми особенностями панд, в частности

gb = df.groupby('model') gb.hist() 

Так как gb имеет 50 групп, результат сильно загроможден, я хотел бы изучить результат только для первых 5 групп.

Я нашел, как выбрать одну группу с groups или get_group ( как получить доступ к базе данных pandas groupby по ключевому слову ), но не как выбрать несколько групп напрямую. Лучшее, что я мог сделать, это:

 groups = dict(list(gb)) subgroup = pd.concat(groups.values()[:4]) subgroup.groupby('model').hist() 

Есть ли более прямой путь?

  • Как читать изображение с пути с символами Unicode?
  • Изменение расширения файла для файлов в папке в Python
  • Анимация Matplotlib внутри вашего собственного графического интерфейса PyQt4
  • Можно ли объединить два декоратора в один на Python?
  • Django: создать входной массив HTML с использованием формы django
  • добавить строки в объект группы Панда
  • Как создать список или кортеж пустых списков в Python?
  • Установка значения по умолчанию для поля в наборе форм в Django
  • 3 Solutions collect form web for “Выберите несколько групп из объекта pandas groupby”

    Вы можете сделать что-то вроде

     new_gb = pandas.concat( [ gb.get_group(group) for i,group in enumerate( gb.groups) if i < 5 ] ).groupby('model') new_gb.hist() 

    Хотя, я бы поступил иначе. Вы можете использовать объекты collections.Counter для быстрого поиска групп:

     import collections df = pandas.DataFrame.from_dict({'model': pandas.np.random.randint(0, 3, 10), 'param1': pandas.np.random.random(10), 'param2':pandas.np.random.random(10)}) # model param1 param2 #0 2 0.252379 0.985290 #1 1 0.059338 0.225166 #2 0 0.187259 0.808899 #3 2 0.773946 0.696001 #4 1 0.680231 0.271874 #5 2 0.054969 0.328743 #6 0 0.734828 0.273234 #7 0 0.776684 0.661741 #8 2 0.098836 0.013047 #9 1 0.228801 0.827378 model_groups = collections.Counter(df.model) print(model_groups) #Counter({2: 4, 0: 3, 1: 3}) 

    Теперь вы можете перебирать объект Counter как словарь, и запрашивать группы, которые вы хотите:

     new_df = pandas.concat( [df.query('model==%d'%key) for key,val in model_groups.items() if val < 4 ] ) # for example, but you can select the models however you like # model param1 param2 #2 0 0.187259 0.808899 #6 0 0.734828 0.273234 #7 0 0.776684 0.661741 #1 1 0.059338 0.225166 #4 1 0.680231 0.271874 #9 1 0.228801 0.827378 

    Теперь вы можете использовать встроенную функцию pandas.DataFrame.groupby

     gb = new_df.groupby('model') gb.hist() 

    Поскольку model_groups содержит все группы, вы можете просто выбрать из них, как хотите.

    заметка

    Если ваш столбец model содержит строковые значения (имена или что-то) вместо целых чисел, все будет работать одинаково – просто измените аргумент запроса от 'model==%d'%key до 'model=="%s"'%key ,

    Было бы проще просто сначала отфильтровать ваш df, а затем выполнить groupby:

     In [155]: df = pd.DataFrame({'model':np.random.randint(1,10,100), 'value':np.random.randn(100)}) first_five = df['model'].sort(inplace=False).unique()[:5] gp = df[df['model'].isin(first_five)].groupby('model') gp.first() Out[155]: value model 1 -0.505677 2 1.217027 3 -0.641583 4 0.778104 5 -1.037858 

    Я не знаю, как использовать метод .get_group() нескольких групп.

    Однако вы можете перебирать группы

    Это все еще немного уродливо, но вот одно решение с итерацией:

     limit = 5 i = 0 for key, group in gd: print key, group i += 1 if i >= limit: break 

    Вы также можете сделать цикл с .get_group() , который imho. немного красивее, но все же довольно уродливое.

     for key in gd.groups.keys()[:2]: print gd.get_group(key) 
    Python - лучший язык программирования в мире.