Как отфильтровать массив данных MultiIndex по максимальным значениям 1-го уровня? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий фрейм данных s:

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

first  second
bar    1        -0.493897
       2        -0.274826
baz    1        -0.337298
       2        -0.564097
foo    1        -1.545826
       2         0.159494
qux    3        -0.876819
       2         0.780388
dtype: float64

Я хотел бы преобразовать его в:

first  second
bar    2        -0.274826
baz    2        -0.564097
foo    2         0.159494
qux    3        -0.876819
dtype: float64

Взяв max second каждого first.

Я пытался сделать s.groupby(level=1).apply(max), но это возвращает:

second
1   -0.337298
2    0.780388
dtype: float64

Очевидно, что моя попытка возвращает максимум для каждой группы в second вместо max second для каждого first.

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Использование idxmax и логическое индексирование:

s[s.groupby(level=0).idxmax()]

Вывод:

first  second
bar    2         0.482328
baz    1         0.244788
foo    2         1.310233
qux    2         0.297813
dtype: float64
0 голосов
/ 18 декабря 2018

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

s.sort_values().groupby(level=0).tail(1)
Out[33]: 
first  second
bar    2        -1.806466
baz    2        -0.776890
foo    1        -0.641193
qux    2        -0.455319
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...