Как эффективно отфильтровать фрейм данных, полученный с помощью операции с двумя столбцами, чтобы включить только максимальные и минимальные значения второго индекса? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть фрейм данных df, который был получен при выполнении групповой операции с двумя столбцами:

df = data.groupby(['letters', 'syllables']).size()

Вот выходные данные первых 11 строк df:

                      0
letters syllables      
1       1            25
        3             1
2       1           188
        2            44
        3             1
        4             1
3       1          1304
        2           189
        3            89
        4             2
        5             3

Я бы хотел отфильтровать df, чтобы для каждого индекса в letters отображались только максимальные и минимальные индексы syllables, что дает следующий вывод:

                      0
letters syllables      
1       1            25
        3             1
2       1           188
        4             1
3       1          1304
        5             3

Еще лучше было бы создать фрейм данных следующим образом:

                               0
letters statistic syllables     
1       min       1           25
        max       3            1
2       min       1          188
        max       4            1
3       min       1         1304
        max       5            3

Полный фрейм данных содержит 120 строк.Я знаю, что мог бы сделать это с помощью цикла, но я пытаюсь лучше понять операции pandas и хотел бы знать, как сделать это более эффективно.

Приведенные выше примеры данных могут быть импортированы из файла csv вфрейм данных многоуровневого индекса с использованием следующего:

df = pd.read_csv('data.csv', index_col=[0,1])

Редактировать: Вот вывод кода, предложенного Эрфаном:

df = data.groupby(['letters', 'syllables']).agg({'letters' : 'size', 'syllables' : ['min', 'max']})

Вывод:

                  letters syllables    
                     size       min max
letters syllables                      
1       1              25         1   1
        3               1         3   3
2       1             188         1   1
        2              44         2   2
        3               1         3   3
        4               1         4   4
3       1            1304         1   1
        2             189         2   2
        3              89         3   3
        4               2         4   4
        5               3         5   5

1 Ответ

1 голос
/ 20 апреля 2019

Вы можете сделать это отдельно, затем concat вернуть

s=data.groupby(['letters', 'syllables']).size().sort_values(0)
yourdf=pd.concat([s.groupby(level=0).head(1),s.groupby(level=0).tail(1)],keys=['min','max']).swaplevel(i=0,j=1).sort_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...