Pandas сортировать, но поддерживать в группе - PullRequest
0 голосов
/ 20 апреля 2020

Например, у меня есть df с такими столбцами:

Area     Prod     Count
  A           A1          5
  A           A2          4
  B           B1          5
  B           B2         11
  B           B3         15
  C           C1          5 

Я хочу применить сортировку по вхождениям, а затем отсортировать по Count Например, после сортировки df должен выглядеть так:

Area     Prod     Count
  B           B3         15
  B           B2         11
  B           B1          1
  A           A1          5
  A           A2          4
  C           C1          5 

Так как B имеет 3 строки, сначала выполняется сортировка, затем внутри B сортировка Prod производится по Count Я пытался использовать df.groupby('area', 'prod').sort_values(by=('Count'), ascending=False)), но не смог ее решить. Спасибо

1 Ответ

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

Одна идея состоит в том, чтобы создать индекс по количеству и затем использовать его для сортировки:

df.index = df['Area'].map(df['Area'].value_counts()).rename('idx')

print (df.sort_values(['idx','Count'], ascending=False))
    Area Prod  Count
idx                 
3      B   B3     15
3      B   B2     11
3      B   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

df = df.sort_values(['idx','Count'], ascending=False).reset_index(drop=True)
print (df)
  Area Prod  Count
0    B   B3     15
1    B   B2     11
2    B   B1      5
3    A   A1      5
4    A   A2      4
5    C   C1      5

Но проблема должна быть, если существует несколько одинаковых подсчетов, добавлена ​​группа D с длиной 3 :

print (df)
  Area Prod  Count
0    A   A1      5
1    A   A2      4
2    B   B1      5
3    B   B2     11
4    B   B3     15
5    C   C1      5
6    D   A1     50
7    D   A2     40
8    D   B1      5

Затем создайте индекс по счетам:

df.index = df['Area'].map(df['Area'].value_counts()).rename('idx')
print (df)
    Area Prod  Count
idx                 
2      A   A1      5
2      A   A2      4
3      B   B1      5
3      B   B2     11
3      B   B3     15
1      C   C1      5
3      D   A1     50
3      D   A2     40
3      D   B1      5

Но если сортировка аналогична первому решению, это смешанные строки:

print (df.sort_values(['idx','Count'], ascending=False))
    Area Prod  Count
idx                 
3      D   A1     50
3      D   A2     40
3      B   B3     15
3      B   B2     11
3      B   B1      5
3      D   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

Решение - это добавить столбец Area для сортировки, например, по убыванию:

print (df.sort_values(['idx','Area','Count'], ascending=False))
    Area Prod  Count
idx                 
3      D   A1     50
3      D   A2     40
3      D   B1      5
3      B   B3     15
3      B   B2     11
3      B   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

Или вы можете отсортировать Area по возрастанию:

print (df.sort_values(['idx','Area','Count'], ascending=[False, True, False]))
    Area Prod  Count
idx                 
3      B   B3     15
3      B   B2     11
3      B   B1      5
3      D   A1     50
3      D   A2     40
3      D   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...