Сортировка по индексу и значению в многоиндексированных данных Pandas фрейм данных - PullRequest
2 голосов
/ 09 марта 2020

Предположим, у меня есть дата-кадр, как показано ниже:

    year    month   message
0   2018    2   txt1
1   2017    4   txt2
2   2019    5   txt3
3   2017    5   txt5
4   2017    5   txt4
5   2020    4   txt3
6   2020    6   txt3
7   2020    6   txt3
8   2020    6   txt4

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

df.groupby(['year','month']).count()

, в результате чего:

            message
year    month   
2017    4   1
        5   2
2018    2   1
2019    5   1
2020    4   1
        6   3

Данные в порядке возрастания для обоих индексов. Но как найти результаты, как показано ниже, где данные отсортированы по годам (по возрастанию) и по количеству (по убыванию) для верхних значений n. Индекс «месяц» будет бесплатным.

            message
year    month   
2017    5   2
        4   1
2018    2   1
2019    5   1
2020    6   3
        4   1

Ответы [ 5 ]

2 голосов
/ 09 марта 2020

value_counts дает вам сортировку по умолчанию:

df.groupby('year')['month'].value_counts()

Вывод:

year  month
2017  5        2
      4        1
2018  2        1
2019  5        1
2020  6        3
      4        1
Name: month, dtype: int64

Если вы хотите, чтобы только 2 верхних значения для каждого года, выполните другое групповое задание:

(df.groupby('year')['month'].value_counts()
   .groupby('year').head(2)
)

Вывод:

year  month
2017  5        2
      4        1
2018  2        1
2019  5        1
2020  6        3
      4        1
Name: month, dtype: int64
2 голосов
/ 09 марта 2020

Это будет сортировать по году (по возрастанию) и считать (по убыванию).

df = df.groupby(['year', 'month']).count().sort_values(['year', 'message'], ascending=[True, False])
1 голос
/ 09 марта 2020

здесь вы go

df.groupby(['year', 'month']).count().sort_values(axis=0, ascending=False, by='message').sort_values(axis=0, ascending=True, by='year')
1 голос
/ 09 марта 2020

Вы можете использовать sort_index, указав ascending=[True,False], так что только второй уровень будет отсортирован в порядке убывания:

df = df.groupby(['year','month']).count().sort_index(ascending=[True,False])

              message
year month         
2017 5            2
     4            1
2018 2            1
2019 5            1
2020 6            3
     4            1
0 голосов
/ 09 марта 2020

вы можете использовать этот код для него.

df.groupby(['year', 'month']).count().sort_index(axis=0, ascending=False).sort_values(by="year", ascending=True)
...