Pandas groupby multiindex, когда уникален на первом уровне: неожиданные результаты - PullRequest
0 голосов
/ 19 ноября 2018

Python версия: 3.5.2;Версия Pandas: 0.23.1

Я замечаю неожиданное поведение, когда я группирую, используя два индекса, но каждая строка уникальна в первом индексе.Код, который я выполняю для моего фрейма данных со столбцом c:

df.c.groupby(df.index.names).min()

Все работает, как ожидается, когда строки не являются уникальными в первом индексе.Чтобы сделать это понятным, я включил две версии ниже.Изменить: теперь включает три версии!

Версия 1: имеет ожидаемый вывод

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [1, 2, 4]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()

Ввод:

     c
a b   
1 2  3
  2  4
4 5  6

Выход:

a  b
1  2    3
4  5    6

Версия 2: имеет неожиданный вывод

df = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()

Ввод:

     c
a b   
1 2  3
4 5  6

Выход:

a    3
b    6

Ожидаемый результат:

a  b
1  2    3
4  5    6

Версия 3: ожидаемый результат, но не ожидаемый с учетом версии 2.

df = pd.DataFrame([[1, 2, 3, 4], [4, 5, 6, 7]], columns=['a', 'b1', 'b2', 'c'])
df = df.set_index(['a','b1','b2']).sort_index()

Ввод:

         c
a b1 b2   
1 2  3   4
4 5  6   7

Выход:

a  b1  b2
1  2   3     4
4  5   6     7

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вот взгляд на то, что происходит.Взгляните на название серии, которая передается в «прикладную» функцию, f.

В первом случае (ожидаемые результаты):

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [1, 2, 4]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()

def f(x):
    print(x)
    print('\n')
    print(min(x))
    print('\n')
    return min(x)
df.c.groupby(['a','b']).apply(f)

Вывод:

a  b
1  2    3
   2    4
Name: (1, 2), dtype: int64


3


a  b
4  5    6
Name: (4, 5), dtype: int64


6


Out[292]:

a  b
1  2    3
4  5    6

Во втором случае (неожиданные результаты) запишите имя серии, переданной в:

df1 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
df1 = df1.set_index(['a','b']).sort_index()
def f(x):
    print(x)
    print('\n')
    print(min(x))
    print('\n')
    return min(x)
df1.c.groupby(['a','b']).apply(f)

Вывод:

a  b
1  2    3
Name: a, dtype: int64


3


a  b
4  5    6
Name: b, dtype: int64


6


Out[293]:

a    3
b    6
Name: c, dtype: int64

Он использует эти серии дляпостроить результирующий кадр данных.Наименование серии является виновником характера данных.Зачем?Что ж, нам нужно разобраться в коде для этого.

Идиоматическое решение этой проблемы - использовать следующий синтаксис:

df1.groupby(df1.index.names)['c'].min()

Вывод:

a  b
1  2    3
4  5    6
Name: c, dtype: int64
0 голосов
/ 19 ноября 2018

Вы можете использовать аргумент level groupby:

>>> df
     c
a b   
1 2  3
4 5  6

>>> df.c.groupby(level=[0,1]).min()
a  b
1  2    3
4  5    6
Name: c, dtype: int64

Из документов

уровень : int, имя уровня или последовательность, по умолчанию None

Если ось является многоиндексной (иерархической), группируйте по определенному уровню или уровням

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