Расширенная сортировка и индексирование MultiIndex - PullRequest
0 голосов
/ 04 июля 2018

У меня есть данные с> 100 тыс. Строк, и мне нужно эффективно перегруппировать их из левого DataFrame в мультииндексированный правый, индексы которого сортируются по сумме значений в 3-м столбце, а внутри каждого индекса значения 2-го столбца сортируются по значения в 3-м столбце. Все сортировки по убыванию.

Я понятия не имею, как это сделать правильно, и уже потратил целый день на то, чтобы это выяснить.

 a   b  c           a sum b  c  %
foo one 1          foo 5 one 3 3/5
foo two 2                two 2 2/5
bar one 1    =>    baz 4 two 3 3/4
baz one 1                one 1 1/4
baz two 3          bar 3 six 2 2/3
foo one 2                one 1 1/3
bar six 2           

UPDATE : Код, заданный @ jezrael , работает очень хорошо, но выводит его следующим образом:

                  %
a   sum b   c      
foo 5   one 3  0.60
        two 2  0.40
        six NaN NaN
baz 4   two 3  0.75
        one 1  0.25
        six NaN NaN
bar 1   one 1  1.00
        two NaN NaN
        six NaN NaN

Можно ли избавиться от этих строк с помощью NaN?

ОБНОВЛЕНИЕ № 2: Я нашел проблему, которая дает проблему NaNs. Это было вызвано типом данных 'category' . Как это влияет на поведение кода, я не знаю. Просто указав причину.

1 Ответ

0 голосов
/ 04 июля 2018

Я считаю нужным:

#aggregate sum by a, b columns
df = df.groupby(['a','b'], as_index=False)['c'].sum()
print (df)
     a    b  c
0  bar  one  1
1  baz  one  1
2  baz  two  3
3  foo  one  3
4  foo  two  2

#create new column by position with transform sum per a column
df.insert(1, 'sum', df.groupby('a')['c'].transform('sum'))
#division of columns
df['%'] = df['c'].div(df['sum'])
print (df)
     a  sum    b  c     %
0  bar    1  one  1  1.00
1  baz    4  one  1  0.25
2  baz    4  two  3  0.75
3  foo    5  one  3  0.60
4  foo    5  two  2  0.40

#sorting by multiple columns and create MultiIndex  
df = df.sort_values(['sum','c'], ascending=False).set_index(['a','sum','b', 'c'])
print (df)
                  %
a   sum b   c      
foo 5   one 3  0.60
        two 2  0.40
baz 4   two 3  0.75
        one 1  0.25
bar 1   one 1  1.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...