Сохранить некоторые группы из GroupBy, используя список индексов - PullRequest
1 голос
/ 23 апреля 2020

Hello StackOverflowers!

У меня есть pandas DataFrame

df = pd.DataFrame({
    'A':[1,1,2,1,3,3,1,6,3,5,1],
    'B':[10,10,300,10,30,40,20,10,30,45,20],
    'C':[20,20,20,20,15,20,15,15,15,15,15],
    'D':[10,20,30,40,80,10,20,50,30,10,70],
    'E':[10,10,10,22,22,3,4,5,9,0,1]
})

Затем я группирую его по некоторым столбцам

groups = df.groupby(['A', 'B', 'C'])

Я хочу выбрать / фильтровать исходные данные на основе индексов группировки.

Например, я хотел бы получить 3 случайные комбинации из группы

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Вместо того, чтобы повторять по всем группам len(indices) раз и индексировать соответствующее значение indices каждый раз, получите список групп keys из словаря, возвращенного GroupBy.groups, и выполните одиночные вызовы на GroupBy.get_group для каждого индекса:

keys = list(groups.groups.keys())
# [(1, 10, 20), (1, 20, 15), (2, 300, 20)...
pd.concat([groups.get_group(keys[i]) for i in indices])

    A   B   C   D   E
6   1  20  15  20   4
10  1  20  15  70   1
5   3  40  20  10   3
4   3  30  15  80  22
8   3  30  15  30   9
0 голосов
/ 23 апреля 2020

Что я мог бы сделать, это

groups = df.groupby(['A', 'B', 'C'])

indices = [1, 4, 3]
pd.concat([[df_group for names, df_group in groups][i] for i in indices])

Что приводит к:

Out[24]: 
    A   B   C   D   E
6   1  20  15  20   4
10  1  20  15  70   1
5   3  40  20  10   3
4   3  30  15  80  22
8   3  30  15  30   9

Интересно, есть ли более элегантный способ, возможно, уже реализованный в pd.groupby ()

...