Подтвердить что ты не робот

Что делает аргумент group_keys для pandas.groupby?

В pandas.DataFrame.groupby существует аргумент group_keys, который, как я собираюсь, должен делать что-то, связанное с тем, как групповые ключи включенного в подмножества dataframe. Согласно документации:

group_keys: boolean, по умолчанию True

При вызове apply добавьте ключи группы для индексации для идентификации фрагментов

Однако я не могу найти примеры, где group_keys имеет реальную разницу:

import pandas as pd

df = pd.DataFrame([[0, 1, 3],
                   [3, 1, 1],
                   [3, 0, 0],
                   [2, 3, 3],
                   [2, 1, 0]], columns=list('xyz'))

gby = df.groupby('x')
gby_k = df.groupby('x', group_keys=False)

Это не влияет на вывод apply:

ap = gby.apply(pd.DataFrame.sum)
#    x  y  z
# x         
# 0  0  1  3
# 2  4  4  3
# 3  6  1  1

ap_k = gby_k.apply(pd.DataFrame.sum)
#    x  y  z
# x         
# 0  0  1  3
# 2  4  4  3
# 3  6  1  1

И даже если вы распечатываете сгруппированные подмножества по ходу, результаты все равно идентичны:

def printer_func(x):
    print(x)
    return x

print('gby')
print('--------------')
gby.apply(printer_func)
print('--------------')

print('gby_k')
print('--------------')
gby_k.apply(printer_func)
print('--------------')

# gby
# --------------
#    x  y  z
# 0  0  1  3
#    x  y  z
# 0  0  1  3
#    x  y  z
# 3  2  3  3
# 4  2  1  0
#    x  y  z
# 1  3  1  1
# 2  3  0  0
# --------------
# gby_k
# --------------
#    x  y  z
# 0  0  1  3
#    x  y  z
# 0  0  1  3
#    x  y  z
# 3  2  3  3
# 4  2  1  0
#    x  y  z
# 1  3  1  1
# 2  3  0  0
# --------------

Я рассмотрел возможность того, что аргумент по умолчанию на самом деле True, но переключение group_keys на явно False тоже не имеет значения. Для чего именно этот аргумент?

(Запуск в pandas версия 0.18.1)

Edit: Я нашел способ, в котором group_keys изменяет поведение, основанное на этом ответе:

import pandas as pd
import numpy as np

row_idx = pd.MultiIndex.from_product(((0, 1), (2, 3, 4)))
d = pd.DataFrame([[4, 3], [1, 3], [1, 1], [2, 4], [0, 1], [4, 2]], index=row_idx)

df_n = d.groupby(level=0).apply(lambda x: x.nlargest(2, [0]))
#        0  1
# 0 0 2  4  3
#     3  1  3
# 1 1 4  4  2
#     2  2  4

df_k = d.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, [0]))

#      0  1
# 0 2  4  3
#   3  1  3
# 1 4  4  2
#   2  2  4

Тем не менее, я до сих пор не ясно понял понятный принцип, который должен делать group_keys. Такое поведение не кажется интуитивным на основе ответа @piRSquared.

4b9b3361

Ответ 1

group_keys параметр groupby подходит под apply, который создает дополнительный индексный столбец, соответствующий группированным столбцам [ group_keys=True], и исключает в случае [group_keys=False], особенно во время выполнения операций над отдельными столбцами.

Один из таких примеров:

In [21]: gby = df.groupby('x',group_keys=True).apply(lambda row: row['x'])

In [22]: gby
Out[22]: 
x   
0  0    0
2  3    2
   4    2
3  1    3
   2    3
Name: x, dtype: int64

In [23]: gby_k = df.groupby('x', group_keys=False).apply(lambda row: row['x'])

In [24]: gby_k
Out[24]: 
0    0
3    2
4    2
1    3
2    3
Name: x, dtype: int64

Одно из предназначенных приложений может состоять в том, чтобы группировать один из уровней иерархии, преобразовывая его в объект Multi-index dataframe.

In [27]: gby.groupby(level='x').sum()
Out[27]: 
x
0    0
2    4
3    6
Name: x, dtype: int64

Ответ 2

Если вы передаете функцию, которая сохраняет индекс, pandas пытается сохранить эту информацию. Но если вы передадите функцию, которая удалит все видимость информации индекса, group_keys=True позволяет сохранить эту информацию.

Используйте это вместо

f = lambda df: df.reset_index(drop=True)

Тогда различные groupby

gby.apply(lambda df: df.reset_index(drop=True))

введите описание изображения здесь

gby_k.apply(lambda df: df.reset_index(drop=True))

введите описание изображения здесь