Иерархический индекс Сортировка по столбцам при сохранении исходных столбцов - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь смоделировать фрейм данных Hirarical Index следующим образом:

>>> raw_data = ({'city': ['Delhi', 'Kanpur', 'Mumbai', 'Pune','Delhi', 'Kanpur', 'Mumbai', 'Pune'],
...                 'rank': ['1st', '2nd', '1st', '2nd','1st', '2nd', '1st', '2nd'],
...                 'name': ['Ramesh', 'Kirpal', 'Jungi', 'Sanju','Ramesh', 'Kirpal', 'Jungi', 'Sanju'],
...                 'score1': [10,15,20,25,10,15,20,25],
...                 'score2': [20,35,40,45,20,35,40,45]})

Ниже показано, как выглядит DataFrame, поэтому datFrame идет с индексированием по умолчанию.

>>> df = pd.DataFrame(raw_data, columns = ['city', 'rank', 'name', 'score1', 'score2'])
>>> df
     city rank    name  score1  score2
0   Delhi  1st  Ramesh      10      20
1  Kanpur  2nd  Kirpal      15      35
2  Mumbai  1st   Jungi      20      40
3    Pune  2nd   Sanju      25      45
4   Delhi  1st  Ramesh      10      20
5  Kanpur  2nd  Kirpal      15      35
6  Mumbai  1st   Jungi      20      40
7    Pune  2nd   Sanju      25      45

Я хочу использовать иерархический индекс, выбрав 'city', 'rank' столбцы с методом set.index, сохраняя при этом неизменность исходных столбцов.

>>> df.set_index(['city', 'rank'], drop=False)
               city rank    name  score1  score2
city   rank
Delhi  1st    Delhi  1st  Ramesh      10      20
Kanpur 2nd   Kanpur  2nd  Kirpal      15      35
Mumbai 1st   Mumbai  1st   Jungi      20      40
Pune   2nd     Pune  2nd   Sanju      25      45
Delhi  1st    Delhi  1st  Ramesh      10      20
Kanpur 2nd   Kanpur  2nd  Kirpal      15      35
Mumbai 1st   Mumbai  1st   Jungi      20      40
Pune   2nd     Pune  2nd   Sanju      25      45

Но я хочу, чтобы индекс сначала был city, а затем индекс поrank:

               city rank    name  score1  score2
city   rank
Delhi  1st    Delhi  1st  Ramesh      10      20
       1st    Delhi  1st  Ramesh      10      20

Kanpur 2nd   Kanpur  2nd  Kirpal      15      35
       2nd   Kanpur  2nd  Kirpal      15      35

Mumbai 1st   Mumbai  1st   Jungi      20      40
       1st   Mumbai  1st   Jungi      20      40

Pune   2nd     Pune  2nd   Sanju      25      45
       2nd     Pune  2nd   Sanju      25      45

1 Ответ

0 голосов
/ 02 октября 2018

Вы почти у цели, вам просто нужно применить sort_index():

df.set_index(['city','rank'], drop=False).sort_index()

Урожайность:

               city rank    name  score1  score2
city   rank                                     
Delhi  1st    Delhi  1st  Ramesh      10      20
       1st    Delhi  1st  Ramesh      10      20
Kanpur 2nd   Kanpur  2nd  Kirpal      15      35
       2nd   Kanpur  2nd  Kirpal      15      35
Mumbai 1st   Mumbai  1st   Jungi      20      40
       1st   Mumbai  1st   Jungi      20      40
Pune   2nd     Pune  2nd   Sanju      25      45
       2nd     Pune  2nd   Sanju      25      45

И чтобы удалить дублирующиеся строки, добавьте drop_duplicates():

df.set_index(['city','rank'], drop=False).sort_index().drop_duplicates()

Выход:

               city rank    name  score1  score2
city   rank                                     
Delhi  1st    Delhi  1st  Ramesh      10      20
Kanpur 2nd   Kanpur  2nd  Kirpal      15      35
Mumbai 1st   Mumbai  1st   Jungi      20      40
Pune   2nd     Pune  2nd   Sanju      25      45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...