Как отсортировать сгруппированные многоиндексные серии панд по уровню индекса и значениям? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть серия панд:

import numpy as np
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
s = pd.Series(np.random.randn(8), index=index)
s
Out[3]: 
first  second
bar    one      -1.111475
       two      -0.644368
baz    one       0.027621
       two       0.130411
foo    one      -0.942718
       two      -1.335731
qux    one       1.277417
       two      -0.242090
dtype: float64

Как отсортировать этот ряд по значениям в каждой группе?

Например, в группе qux должна быть первая строка с двумя, -0.242090и затем строка 1, 1.277417.Групповой бар хорошо отсортирован, потому что -1,111475 ниже -0,644368.

Мне нужно что-то вроде s.groupby (level = 0) .sort_values ​​().

Ответы [ 2 ]

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

Вы можете использовать np.lexsort для сортировки first по первому уровню индекса и second по значениям.

np.random.seed(0)
s = pd.Series(np.random.randn(8), index=index)

s = s.iloc[np.lexsort((s.values, s.index.get_level_values(0)))]

print(s)

# first  second
# bar    two       0.400157
#        one       1.764052
# baz    one       0.978738
#        two       2.240893
# foo    two      -0.977278
#        one       1.867558
# qux    two      -0.151357
#        one       0.950088
# dtype: float64
0 голосов
/ 05 февраля 2019

Использование sort_values:

np.random.seed(0)
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
s = pd.Series(np.random.randn(8), index=index)

s = (s.reset_index(name='value')
      .sort_values(['first', 'value'])
      .set_index(['first', 'second'])['value'])
s.name = None

print(s)
first  second
bar    two       0.400157
       one       1.764052
baz    one       0.978738
       two       2.240893
foo    two      -0.977278
       one       1.867558
qux    two      -0.151357
       one       0.950088
dtype: float64
...