Как сделать "многоиндексированную" группу - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы начать с того, что я новичок в Python, но у меня есть этот DataFrame здесь:

df = pd.DataFrame({'countingVariable': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], 'color': ['red', 'red', 'orange', 'yellow', 'yellow', 'orange', 'red', 'yellow', 'orange'], 'foods': ['apple', 'pepper', 'apple', 'apple', 'apple', 'pepper', 'pepper', 'apple', 'apple']})
b = df.groupby(['color', 'foods']).count().sort_values(['countingVariable', 'foods', 'color'], ascending = [False, False, False])

, где b выглядит так:

               countingVariable
color  foods                   
yellow apple                  3
red    pepper                 2
orange apple                  2
       pepper                 1
red    apple                  1

но я хочу, чтобы это выглядело так:

               countingVariable
color  foods                   
yellow apple                  3
red    pepper                 2
       apple                  1
orange apple                  2
       pepper                 1

, чтобы программа нашла наибольшее количество, а затем поместила его в верхнюю часть вместе с остальной частью группы, к которой оно принадлежит

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Это должно сработать:

df.groupby(['color', 'foods']).count().sort_values('countingVariable', ascending=False)

Вывод:

               countingVariable
color  foods                   
yellow apple                  3
orange apple                  2
       pepper                 2
red    apple                  1
       pepper                 1
0 голосов
/ 18 февраля 2019

Нужно .reindex на 0-м уровне, чтобы получить свою сортировку (еда по наибольшему количеству, затем спускающаяся в еду).Это работает, потому что pd.unique сохраняет порядок.

import pandas as pd

b = b.reindex(b.index.unique(level=0), level=0)

Выход:

               countingVariable
color  foods                   
yellow apple                  3
red    pepper                 2
       apple                  1
orange apple                  2
       pepper                 1
0 голосов
/ 18 февраля 2019

Странно.Вы показываете свой исходный вывод как

print(b)
               countingVariable
color  foods                   
yellow apple                  3
red    pepper                 2
orange apple                  2
       pepper                 1
red    apple                  1

Тем не менее, когда я использую ваш точный код, я получаю другой вывод

df = pd.DataFrame({
  'countingVariable': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'],
  'color': ['red', 'red', 'orange', 'yellow', 'yellow', 'orange', 'orange', 'yellow', 'orange'],
  'foods': ['apple', 'pepper', 'apple', 'apple', 'apple', 'pepper', 'pepper', 'apple', 'apple']
    })
b = df.groupby(['color', 'foods']).count().sort_values(['countingVariable', 'foods', 'color'],
               ascending = [False, False, False])

print(b)
               countingVariable
color  foods                   
yellow apple                  3
orange pepper                 2
       apple                  2
red    pepper                 1
       apple                  1

Это похоже на вывод, который вы действительно хотите.

РЕДАКТИРОВАТЬ

Возможно, опубликованные вами данные чем-то отличаются от того, что вы на самом деле используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...